包装/多模型视图的客户端验证

时间:2011-09-05 03:54:05

标签: c# asp.net-mvc-2 client-side-validation multi-model-forms

我将这两个模型类包装在一个模型中。强类型视图和服务器端验证工作得很好,但我不能让客户端验证适用于这个包装的模型类。

这是我的客户端代码:

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,我收到错误。所以我想我的问题是:

  1. 有没有办法获得指定的模型名称(“Model1Name”)所以我 可以附加属性名称吗?
  2. 我可以从DataAnnotations / ModelValidationRule类传递指定的模型名称吗?如果是这样,怎么样?
  3. 以下是我的模型类:

    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。

    任何帮助将不胜感激。感谢。

1 个答案:

答案 0 :(得分:0)

您的自定义[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