如何向mvcClientValidationMetadata添加新的验证规则?

时间:2012-11-14 13:02:09

标签: javascript jquery validation asp.net-mvc-2

我有一个表格,其中两个字段需要相同(密码和密码确认)。我创建了一个类属性来检查它,在服务器端它运行良好。在客户端它什么都不做。我需要在ValidationSummary中显示该消息(“密码重复”需要与“密码”相同)。

我意识到检查这些字段的最简单方法是手动将规则添加到window.mvcClientValidationMetadata。我试图这样做,但没有任何效果。

我的代码:

<% using (Html.BeginForm("ResetPassword", "Account", FormMethod.Post}))
   { %>
<%= Html.ValidationSummary() %>
    <div>
        <%= Html.ValidationMessageFor(m => m.Email)%>
        <%= Html.LabelFor(m => m.Email)%>
    </div>
    <div>
        <%= Html.TextBoxFor(m => m.Email)%>
        <% Html.ValidateFor(m => m.Email);%>
    </div>
    <div>
        <%= Html.ValidationMessageFor(m => m.PasswordModel.Password)%>
        <%= Html.LabelFor(m => m.PasswordModel.Password)%>
    </div>
    <div>
        <%= Html.PasswordFor(m => m.PasswordModel.Password)%>
    </div>
    <div>
        <%= Html.ValidationMessageFor(m => m.PasswordModel.PasswordRepeated)%>
        <%= Html.LabelFor(m => m.PasswordModel.PasswordRepeated)%>
    </div>
    <div>
        <%= Html.PasswordFor(m => m.PasswordModel.PasswordRepeated)%>
    </div>
    <div>
        <%= Html.ValidationMessageFor(m => m.PasswordModel.PasswordRepeated)%>
        <%= Html.LabelFor(m => m.PasswordModel.PasswordRepeated, true)%>
    </div>
<% } %>
在生成此表单之前执行

Html.EnableClientValidation方法。

下面你会找到解决我问题的方法。

1 个答案:

答案 0 :(得分:0)

您可能做的最糟糕的事情是执行相同的代码 - 您将覆盖现有规则。

要添加验证规则,您需要在<% } %>关闭BeginForm的using(...后立即放置此代码:

<% } %>

<script type="text/javascript">

    window.mvcClientValidationMetadata[0]["Fields"].push( //check if the '0' is number corresponding to your form validation metadata
      {
          "FieldName": "PasswordModel.PasswordRepeated", // name attribute of the element
          "ReplaceValidationMessageContents": false,
          "ValidationMessageId": "PasswordModel_PasswordRepeated_validationMessage", //id of the ValidationMessageFor (if needed)
          "ValidationRules":
          [
            {
                "ErrorMessage": 'Password repeated needs to be the same as Password',
                "ValidationParameters": "#PasswordModel_Password", //'params' parameter in your validation function, can be an object
                "ValidationType": "propertiesMustMatch" //name of the validation function placed in $.validator.methods
            }
          ]
      }
    );

</script>

propertiesMustMatch函数检查给定的字段是否相等(jQuery equalTo在我们的系统中无法正常工作)。

没有“未捕获的TypeError:无法调用方法'推送'未定义的”异常,因为mvcClientValidationMetadata是在放置<script>的{​​{1}}元素中生成的。