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