繁体   English   中英

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

[英]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,并且出现错误。 所以我想我的问题是:

  1. 有没有一种方法来获取分配的模型名称(“ Model1Name”),以便可以将其附加属性名称?
  2. 我可以从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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM