【问题标题】:Client-side validation for wrapped/multi model views包装/多模型视图的客户端验证
【发布时间】:2011-09-05 03:54:05
【问题描述】:

我将这 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 并且我得到一个错误。所以我想我的问题是:

  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。

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

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 您提供的示例在单个属性上运行客户端验证:用验证属性装饰的那个。 OP 需要的是将带有验证属性修饰的属性的值与另一个属性进行比较。
    • @Darin Dimitrov:我认为 iamnobody 不需要比较两个道具,存在不同的问题......但我意识到我错过了问题中的内容 - 我没有注意到作者知道客户端验证规则类...
    • @iamnobody: 你使用 m.Model1Name.EmailAddress)%> 吗?如果是这样,它应该可以正常工作...
    • 他用属性修饰了 Username 属性并尝试获取客户端上 EmailAddress 属性的值。我想他这样做是为了在它们的值之间进行一些比较,但我可能错了。
    • 我正在尝试比较这两个值,但我发现问题在于检索带有前缀的 FULL id。
    猜你喜欢
    • 2016-01-29
    • 2013-11-09
    • 2023-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-28
    相关资源
    最近更新 更多