MVC自定义验证属性

时间:2013-05-30 08:03:32

标签: asp.net-mvc validation attributes

当服务器触发ValidationResult时,是否可以获取HTML自定义属性(客户端)。

我这样做

模特课程:

    public class Model_Test
{
    [Age(18,50)]
    [Display(Name = "My Age")]
    public int Age { get; set; }
}

HTML:

@model CustomValidation.Models.Model_Test
@using (@Html.BeginForm("Index","Test"))
{
    @Html.TextBoxFor(m => m.Age, new { @myValidate="Yes" })
    @Html.TextBoxFor(m => m.Age, new { @myValidate="No" })
    <input type="submit" />
}

自定义属性类:

    public class AgeAttribute : ValidationAttribute
    {
        private readonly int _MinAge = 0;
        private readonly int _MaxAge = 0;
        private const string errorMsg = "{0} must at least {1} or not more than {2}";

        public AgeAttribute(int MinAge, int MaxAge)
            : base(() => errorMsg)
        {
            _MinAge = MinAge;
            _MaxAge = MaxAge;
        }

        //Server-Side Validation
        protected override ValidationResult IsValid(object value, ValidationContext validationContext)
        {



        **// Can we get the HTML Attribute from client side and implement some condition at here???
        // etc...
        // if (html.attribute("myValidate") == "Yes") {
        //    *condition......*
        // } else {
        //    *condition......***
        // }



            if (value != null)
            {
                int data = (int)value;
                if (!(data > (int)_MinAge && data < (int)_MaxAge))
                {
                    return new ValidationResult(null);
                }
            }
            return ValidationResult.Success;
        }
    }

在我的代码中,我得到了2个textboxes,每个都有自定义属性"myValidate="Yes/No"。为了我的验证目的,我可以将此属性带到服务器端ValidationResult ?如果没有,还有其他正确的方法吗?

1 个答案:

答案 0 :(得分:2)

你是在正确的轨道上,但是有一个字段进行验证而另一个没有验证的最佳方法是使用两个单独的属性,只使用自定义属性注释一个:

public class Model_Test
{
    [Age(18,50)]
    [Display(Name = "My Age")]
    public int Age { get; set; }

    [Display(Name = "Another age")]
    public int AnotherAge { get; set; }
}

然后在您的控制器中,您可以使用该属性执行您喜欢的操作,并避免使您的验证代码更复杂。