[英]Client-side validation for wrapped/multi model views
我将这两个模型类包装在一个模型中。 强类型视图和服务器端验证可以很好地工作,但是我无法让此包装的模型类使用客户端验证。
这是我的客户端代码:
Sys.Mvc.ValidatorRegistry.validators.usernameEmail = function (rule) {
var emailProperty = rule.ValidationParameters.emailProperty;
var message = rule.ErrorMessage;
return function (value, context) {
if (!value || !value.length) {
return true;
}
var usernameField = context.fieldContext.elements[0];
var emailFieldId = $('input[name = "' + emailProperty + '"]').attr('id');
var emailField = $get(emailFieldId, usernameField.form);
//...validation stuff...
};
};
问题是emailProperty仅返回其模型中说明的属性名称,即。 “ EmailAddress”,但强类型视图将名称分配为“ Model1Name.EmailAddress”,因为其名称类似于:
<%: Html.TextBoxFor(m => m.Model1Name.EmailAddress)%>
因此,在查找属性时它返回null,并且出现错误。 所以我想我的问题是:
这是我的模型类:
public class Model1
{
public string EmailAddress{ get; set; }
...
}
public class Model2
{
[UsernameEmail]
public string Username{ get; set; }
...
}
public class WrappedModel
{
public Model1 Model1Name{ get; set; }
public Model2 Model2Name { get; set; }
}
旁注:客户端验证适用于单个模型视图。
编辑经过大量调试后,我发现
viewContext.ViewData.TemplateInfo.GetFullHtmlFieldId("EmailAddress");
在我的DataAnnotationsModelValidator中,仅返回参数名称“ EmailAddress”,而省略其前缀“ Model1Name”,从而返回错误的ID。
任何帮助,将不胜感激。 谢谢。
您的自定义[UsenameEmail]属性是一个负责发出正确的客户端验证元数据的部分。 更准确地说,应该为此注册一个验证器适配器。 您需要确保适配器生成完整的属性名称,即“ Model1Name.EmailAddress”,然后“ usernameEmail”客户端功能将收到正确的字段名称,并且将按预期运行。
有关更多详细信息,请参见“ DataAnnotationsModelValidatorProvider.RegisterAdapter(...)”。 这是实现示例-http: //weblogs.asp.net/jacqueseloff/archive/2009/12/17/asp-net-mvc-2-rc-validating-credit-card-numbers.aspx
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.