[英]C# MVC5 Validate in Model with a List
在一个类中,我有一个允许使用的静态值列表
private static List<string> allowedClassNames = new List<string> {"Real Estate", "Factored Debt"};
而且我还有该类的一个属性,我想将其限制为该列表中的值。
[Required]
public string assetClassName { get; set; }
我想在模型级别执行此操作,因此它可以在REST或视图上下文中使用。
我将如何实施强制将提交中的值限制为该列表?
谢谢!
这就是我要解决的地方-尚未经过全面测试,但可以为将来的海报提供一个思路。
class MustContainAttribute : RequiredAttribute
{
public string Field { get; private set; }
List<string> allowed;
public MustContainAttribute(string validateField)
{
this.Field = validateField;
}
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
switch (Field)
{
case "assetClassName":
allowed = new List<string> { "Real Estate", "Factored Debt" };
break;
default:
return ValidationResult.Success;
}
if (!allowed.Contains(Field))
{
return new ValidationResult("Invalid Value");
}else{
return ValidationResult.Success;
}
}
}
创建一个自定义验证属性:
public class ClassNameRequiredAttribute : RequiredAttribute
{
protected override ValidationResult IsValid(object value, ValidationContext context)
{
Object instance = context.ObjectInstance;
Type type = instance.GetType();
MyAssetClass myAssetClass = (MyAssetClass)type.GetProperty("MyAssetClass").GetValue(instance, null);
if (!string.IsNullOrEmpty(myAssetClass.assetClassName))
{
if (myAssetClass.allowedClassNames.Contains(myAssetClass.assetClassName))
{
return ValidationResult.Success;
}
}
return new ValidationResult(ErrorMessage);
}
}
在您的模型中:
[ClassNameRequired(ErrorMessage="Your error message.")]
public string assetClassName { get; set; }
如评论中所述,您可以创建自己的ValidationAttribute。 如果您在多个模型上进行了此验证,或者您还想实现客户端验证(JavaScript),这将非常有用
但是,一种简单的一次性验证方法是IValidatableObject。 您可以按以下方式使用它:
public class AssetModel:IValidatableObject
{
private static List<string> allowedClassNames = new List<string> {"Real Estate", "Factored Debt"};
[Required]
public string assetClassName { get; set; }
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{
if (!allowedClassNames.Contains(assetClassName)
{
yield new ValidationResult("Not an allowed value", new string[] { "assetClassName" } );
}
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.