【问题标题】:Client validate non-model bound checkbox while using MVC 2 jQuery Validation客户端在使用 MVC 2 jQuery 验证时验证非模型绑定复选框
【发布时间】:2011-01-15 03:58:55
【问题描述】:

拥有:使用 ASP.NET MVC 2、基于 DataAnnotationsModel 的服务器验证,以及使用 jQuery 的客户端验证。使用基于 jQuery 的验证(jQuery.validate 和 MicrosoftMvcJQueryValidation.js)在客户端上完美验证了我模型中的任何内容。

需要:在我的表单中添加一个额外的 HTML <input type="checkbox" id="terms" />。我需要 jQuery 验证来要求选中此复选框,并以某种方式将其与任何 jQuery 客户端脚本 MVC 自动控制的挂钩。是的,我知道它不会在服务器端验证,但我不需要或不希望它这样做。

看起来它应该很简单,但我是 MVC 的新手,是 jQuery 的初学者,我的搜索一直是空白。

任何帮助将不胜感激!

【问题讨论】:

    标签: asp.net-mvc jquery-validate


    【解决方案1】:

    这里有一个解决方案。它模仿了 mvc 挂钩 jQuery 验证的方法。所以有一个不属于模型的名为 Accept 的复选框。该脚本必须在表单之后添加该字段的所有验证元数据。

        <%
            Html.EnableClientValidation(); %>
        <% using(Html.BeginForm("Show"))
    { %>
          <%= Html.EditorForModel() %>
          <div class="editor-field">
            <%= Html.CheckBox("Accept", new { @class = "required" })%> 
            <span class="field-validation-valid" id="Accept_validationMessage"></span>
          </div>
          <input type="submit" value="Submit" />
    <%} %>
    <script type="text/javascript">
        window.mvcClientValidationMetadata[0].Fields.push({
            FieldName: "Accept",
            ReplaceValidationMessageContents: true,
            ValidationMessageId: "Accept_validationMessage",
            ValidationRules: [{ ErrorMessage: "The Accept field is required.", ValidationType: "required", ValidationParameters: {}}]
        });
    </script>
    

    【讨论】:

    • 这让我更接近,但此复选框的验证似乎与 MVC 的自动连接 jQuery 验证事件竞争。发生的情况是我看到新复选框的客户端验证消息,但随后所有其他字段的验证消息都消失了。
    • @Justin 我已经设置了一个测试页面,其中包含一个 Html.EditorFor() 语句和一个带有 class="required" 的额外复选框,但我没有看到竞争消息。也许您可以发布您的 aspx 和 JS 代码。
    • 这个有JS代码吗? jQuery.validate 库不使用复选框的class="required" 属性来连接表单提交验证检查吗?
    【解决方案2】:

    我是否建议为每个视图使用 ViewModel(将所有数据注释放在那里)。然后您可以为您的复选框创建一个布尔模型属性并将其设置为必需。

    从那里,如果您要将模型发布回控制器,您可以简单地使用 AutoMapper 将 ViewModel 映射到所需的模型,或者简单地自己映射属性。

    无论哪种方式,对每个视图都使用 ViewModel 是一种很好的做法。请记住,ViewModel 的工作是尝试包含视图中所需的所有内容。这绝对意味着它可以并且将会拥有模型中不需要的其他数据。

    【讨论】:

    • 我希望避免这一切,因为我还必须创建一个自定义验证器类,将其注册到 global.asax, bla, bla.... 一个小复选框的工作量太大无论如何我都不需要存储价值。但我看不出有什么办法,这就是我必须做的。谢谢。
    • 如果您愿意升级到 MVC 3,您可以构建验证器控制器而不是自定义验证器。然后,您可以将remote validation 用于您的客户端内容。
    • 那将是理想的,但我被困在 .NET 3.5 平台上。但是,事实证明我不需要自定义验证器。我假设我会,因为我认为 jQuery 只会评估文本值(真或假)并看到它不是空字符串,因此满足 DataAnnotation 'Required' 要求。我错了。使用 [Required(ErrorMessage = "Checkbox must be checked")] 确实有效,并且被 jQuery 正确评估;无需自定义验证器
    【解决方案3】:

    试试这个

    $(document).ready(function() {
        //// Assuming your form's ID is 'form0'
        $("#form0").submit(function() {  
            if ($("#terms").attr('checked')) {
                return true;
            }
            else
            {
               //// Error message if any
               return false;
            }
        });
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多