我将这 2 个模型类包装在一个模型中。强类型视图和服务器端验证工作得很好,但我无法让客户端验证为这个包装的模型类工作。
这是我的客户端代码:
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 并且出现错误。所以我想我的问题是:
- 有没有办法获取分配的模型名称(“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。
任何帮助,将不胜感激。谢谢。