c# MVC5用列表验证模型
本文关键字:验证 模型 列表 MVC5 | 更新日期: 2023-09-27 18:13:34
在一个类中,我有一个允许的值的静态列表
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" } );
}
}
}