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;
        }
    }
}

c# MVC5用列表验证模型

创建自定义验证属性:

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" } );
        }
    }
}