如何使用数据注释对模型进行条件验证?
例如,假设我们有以下模型(Person和and ):
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“属性的选择的"Senior.Description”属性条件必填字段(需要真正的-> )。如何在ASP.NET MVC2中实现带数据注解的条件验证?
发布于 2011-03-13 04:40:04
在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.");
}
}
请访问Introducing ASP.NET MVC 3 (Preview 1)了解更多信息。
发布于 2013-04-13 00:00:06
昨天我也遇到了同样的问题,但我用了一种非常简洁的方式,这对客户端和服务器端的验证都有效。
条件:基于模型中其他属性的值,您希望使另一个属性成为必需属性。以下是代码
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 (属性)的特定值,必须验证其他属性是否为required
假设您有以下内容
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));
发布于 2016-06-17 23:52:46
我一直在使用这个神奇的nuget,它可以做动态注解ExpressiveAnnotations
你可以验证你所梦想的任何逻辑:
public string Email { get; set; }
public string Phone { get; set; }
[RequiredIf("Email != null")]
[RequiredIf("Phone != null")]
[AssertThat("AgreeToContact == true")]
public bool? AgreeToContact { get; set; }
https://stackoverflow.com/questions/2417113
复制相似问题