包装/多模型视图的客户端验证
本文关键字:客户端 验证 视图 模型 包装 | 更新日期: 2023-09-27 18:07:24
我将这两个模型类包装在一个模型中。强类型视图和服务器端验证工作得很好,但我无法让客户端验证为这个包装的模型类工作。
下面是我的客户端代码: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只返回在它的模型ie中声明的属性名。"EmailAddress",但是强类型视图将名称分配为"Model1Name"。EmailAddress",因为它被称为:
<%: Html.TextBoxFor(m => m.Model1Name.EmailAddress)%>
因此,它返回null时,寻找属性,我得到一个错误。所以我想我的问题应该是:
- 是否有一种方法来获得分配的模型名称("Model1Name"),所以我可以在后面加上属性名吗?
- 我可以从DataAnnotations/ModelValidationRule类传递分配的模型名称吗?如果有,怎么做?
下面是我的模型类:
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