繁体   English   中英

C#MVC5在具有列表的模型中进行验证

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM