ASP.NET MVC有条件验证

如何使用数据注释对模型进行条件验证?

例如,假设我们有以下模型(人员和高级):

public class Person
{
    [Required(ErrorMessage = "*")]
    public string Name
    {
        get;
        set;
    }

    public bool IsSenior
    {
        get;
        set;
    }

    public Senior Senior
    {
        get;
        set;
    }
}

public class Senior
{
    [Required(ErrorMessage = "*")]//this should be conditional validation, based on the "IsSenior" value
    public string Description
    {
        get;
        set;
    }
}

和以下看法:

<%= Html.EditorFor(m => m.Name)%>
<%= Html.ValidationMessageFor(m => m.Name)%>

<%= Html.CheckBoxFor(m => m.IsSenior)%>
<%= Html.ValidationMessageFor(m => m.IsSenior)%>

<%= Html.CheckBoxFor(m => m.Senior.Description)%>
<%= Html.ValidationMessageFor(m => m.Senior.Description)%>

我希望成为基于选择“IsSenior”propery(true - > required)的“Senior.Description”属性有条件的必填字段。 如何在ASP.NET MVC 2中使用数据注释实现条件验证?


在MVC3中添加条件验证规则有更好的方法。 让模型继承IValidatableObject并实现Validate方法:

public class Person : IValidatableObject
{
    public string Name { get; set; }
    public bool IsSenior { get; set; }
    public Senior Senior { get; set; }

    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext) 
    { 
        if (IsSenior && string.IsNullOrEmpty(Senior.Description)) 
            yield return new ValidationResult("Description must be supplied.");
    }
}

请参阅http://weblogs.asp.net/scottgu/archive/2010/07/27/introducing-asp-net-mvc-3-preview-1.aspx中的更多说明


我通过处理控制器包含的“ModelState”字典解决了这个问题。 ModelState字典包含所有必须验证的成员。

解决方案如下:

如果您需要基于某个字段实现条件验证 (例如,如果A = true,则需要B), 同时保持属性级错误消息传递 (对于处于对象级别的自定义验证器,这不是事实),您可以实现此目的通过处理“ModelState”,只需从它中删除不需要的验证。

......在某些班级......

public bool PropertyThatRequiredAnotherFieldToBeFilled
{
  get;
  set;
}

[Required(ErrorMessage = "*")] 
public string DepentedProperty
{
  get;
  set;
}

...继续......

...在某些控制器操作中...

if (!PropertyThatRequiredAnotherFieldToBeFilled)
{
   this.ModelState.Remove("DepentedProperty");
}

...

有了这个,我们实现了条件验证,而让其他所有条件都一样。


更新:

这是我的最终实现:我已经在模型上使用了一个接口,并使用了action属性来验证实现了上述接口的模型。 接口规定了Validate(ModelStateDictionary modelState)方法。 action上的属性只是调用IValidatorSomething上的Validate(modelState)。

我不想让这个答案复杂化,所以我没有提到最终的实现细节(最后,这是生产代码中的问题)。


我昨天遇到了同样的问题,但是我以非常干净的方式完成了这项工作,可用于客户端和服务器端验证。

条件:基于模型中其他财产的价值,您想要创造另一个财产。 这是代码

public class RequiredIfAttribute : RequiredAttribute
{
    private String PropertyName { get; set; }
    private Object DesiredValue { get; set; }

    public RequiredIfAttribute(String propertyName, Object desiredvalue)
    {
        PropertyName = propertyName;
        DesiredValue = desiredvalue;
    }

    protected override ValidationResult IsValid(object value, ValidationContext context)
    {
        Object instance = context.ObjectInstance;
        Type type = instance.GetType();
        Object proprtyvalue = type.GetProperty(PropertyName).GetValue(instance, null);
        if (proprtyvalue.ToString() == DesiredValue.ToString())
        {
            ValidationResult result = base.IsValid(value, context);
            return result;
        }
        return ValidationResult.Success;
    }
}

这里的PropertyName是你想让你的条件的属性DesiredValue是PropertyName(属性)的特定值,你的其他属性必须根据需要进行验证

假设你有以下几点

public class User
{
    public UserType UserType { get; set; }

    [RequiredIf("UserType", UserType.Admin, ErrorMessageResourceName = "PasswordRequired", ErrorMessageResourceType = typeof(ResourceString))]
    public string Password
    {
        get;
        set;
    }
}

最后但并非最不重要的一点,注册适配器为您的属性,以便它可以做客户端验证(我把它放在global.asax,Application_Start)

 DataAnnotationsModelValidatorProvider.RegisterAdapter(typeof(RequiredIfAttribute),typeof(RequiredAttributeAdapter));
链接地址: http://www.djcxy.com/p/67989.html

上一篇: ASP.NET MVC Conditional validation

下一篇: not able to get json passed into intent to another activity