Asp.net mvc 使用DataAnnotationsModelValidator适配器进行MVC3远程验证
我想使用自定义DataAnnotationsAttribute验证模型的DTO属性上的各种电话号码属性。我不想将DataAnnotations复制到ViewModels上,以保持代码干燥,而是使用DataAnnotationsModelValidatorProvider注册了一个用于客户端验证的自定义适配器。此适配器提供通常由RemoteAttribute使用的ModelClientValidationRemoteRules。jQuery不引人注目的验证然后调用我的验证操作,该操作验证各个字段 然而,这种设置实际上并不充分Asp.net mvc 使用DataAnnotationsModelValidator适配器进行MVC3远程验证,asp.net-mvc,asp.net-mvc-3,data-annotations,model-validation,remote-validation,Asp.net Mvc,Asp.net Mvc 3,Data Annotations,Model Validation,Remote Validation,我想使用自定义DataAnnotationsAttribute验证模型的DTO属性上的各种电话号码属性。我不想将DataAnnotations复制到ViewModels上,以保持代码干燥,而是使用DataAnnotationsModelValidatorProvider注册了一个用于客户端验证的自定义适配器。此适配器提供通常由RemoteAttribute使用的ModelClientValidationRemoteRules。jQuery不引人注目的验证然后调用我的验证操作,该操作验证各个字段
该属性如下所示:
public class PhoneNumberAttribute : ValidationAttribute
{
public PhoneNumberType RequiredType { get; set; }
public PhoneNumberAttribute()
: base("{0} is not a valid phone number.")
{
}
public override bool IsValid(object value)
{
string s = value as string;
if (s == null)
{
return false;
}
if (!PhoneNumberUtils.IsValidNumber(s, RequiredType))
{
return false;
}
return true
}
public override string FormatErrorMessage(string name)
{
return string.Format(ErrorMessageString, name);
}
}
和适配器:
public class PhoneNumberAttributeAdapter : DataAnnotationsModelValidator<PhoneNumberAttribute>
{
public PhoneNumberAttributeAdapter(ModelMetadata metadata, ControllerContext context, PhoneNumberAttribute attribute)
: base(metadata, context, attribute)
{
}
public override IEnumerable<ModelClientValidationRule> GetClientValidationRules()
{
var errorMessage = Attribute.FormatErrorMessage(Metadata.GetDisplayName());
var routeData = new RouteValueDictionary {
{ "controller", "Validate" },
{ "action", Metadata.ContainerType.Name },
};
var path = RouteTable.Routes.GetVirtualPathForArea(ControllerContext.RequestContext, routeData);
var rule = new ModelClientValidationRemoteRule(
errorMessage,
path.VirtualPath,
"POST",
"*." + Metadata.PropertyName);
return new[] { rule };
}
}
看一看这个示例,其中显示了如何在自定义jQuery验证器中甚至使用前缀来获取嵌套属性 其次,MVC模型绑定器应该自动绑定前缀
public ActionResult ProfileDto([Bind(Prefix = "Dto")]ProfileDto model)
{
string fieldToValidate = Request.Form.Keys[0];
if (ModelState.IsValidField(fieldToValidate))
{
return Json(true);
}
var fieldErrors = ModelState[fieldToValidate].Errors;
return Json(fieldErrors.First().ErrorMessage);
}