繁体   English   中英

ASP.NET MVC 3 不显眼 jQuery 客户端验证与子 collections

[英]ASP.NET MVC 3 unobtrusive jQuery client-side validation with child collections

相关问题:

我有一个 ASP.NET MVC 视图呈现用户可以添加到的项目集合:-

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<MySite.Models.Parent>" %>
<% using (Html.BeginForm()) { %>
    <%: Html.ValidationSummary(true) %>
    <%: Html.HiddenFor(model => model.Id) %>
    <table>
        <thead>
            <tr>
                ...
                <th>Value</th>
            </tr>
        </thead>
        <tbody>
            <% foreach (var child in Model.Children)
               {
                   Html.RenderPartial("ChildRow", child );
               } %>
        </tbody>
    </table>
    <p>
        <input type="submit" value="Save" />
        <%= Html.ActionLink<MyController>(x => x.ChildRow(), "Add another...", new { @class = "addRow" }) %>
    </p>
<% } %>

“ChildRow”部分如下:-

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<MySite.Models.Child>" %>
<tr class="editor-row">
    <td>
        <%  Html.EnableClientValidation(true);
            using (Html.BeginCollectionItem("Children")) { %>
        <%: Html.HiddenFor(model => model.Id)%>
    </td>
    <td>
        <%: Html.EditorFor(model => model.Value)%>
        <%: Html.ValidationMessageFor(model => model.Value)%>
        <% } %>
    </td>
</tr>

我正在使用 jQuery 来获取代表行的部分:-

$("a.addRow").live("click", function () {
    $.ajax({
        url: this.href,
        cache: false,
        success: function (html) {
            $(this).parents("form:first").children("table:first tbody:last").append(html);
            $.validator.unobtrusive.parse("form");
        }
    });
    return false;
});

我遇到的问题是客户端验证不适用于 jQuery 添加的行。 正如您从我的脚本中看到的,在 ajax 调用之后,我正在表单上运行验证器。 据我环顾四周,问题是 Html.BeginForm() 调用不在 ajax 部分上,因此验证属性没有被添加到输入元素中。 即,如果我在添加一行后查看标记:-

页面加载时存在的输入如下所示:-

<input name="Children[0a197c09-470c-4ab4-9eef-2bcc5f0df805].Value"
  class="text-box single-line" id="Children_0a197c09-470c-4ab4-9eef-2bcc5f0df805__Value"
  type="text" data-val-required="The Value field is required." data-val="true" value="Test"/>

通过 ajax 添加的输入如下所示:-

<input name="Children[aa5a21b2-90bc-4e06-aadc-1f2032a121aa].Value"
  class="text-box single-line" id="Children_aa5a21b2-90bc-4e06-aadc-1f2032a121aa__Value"
  type="text" value=""/>

显然,由于表单的性质,我无法将 Html.BeginForm 调用移动到我的部分视图上。 由于页面是通过 ajax 加载的,所以我也不能破解我部分的 FormContext。

还有另一种方法可以启用客户端验证吗?

编辑

根据下面的辅导员本的回答,我设置了 FormContext,现在属性可以正确呈现,但是验证仍然无法正常工作(如果我添加新行并将文本框留空,应用程序首先会注意到我的断点在编辑 POST 操作被击中)。

我做了一些测试,$.validator.unobtrusive.parse function肯定被调用了,parseElement function肯定被调用了表中新输入数量的正确次数,并且行“info.attachValidation( );" 进一步向下解析 function 肯定会受到打击。 这就是我所知道的。 还在测试。

您遇到的问题是服务器创建新行时不存在 FormContext。 必须存在 FormContext 才能将不显眼的验证属性添加到生成的 HTML。 将以下内容添加到局部视图的顶部:

if (this.ViewContext.FormContext == null) 
{
    this.ViewContext.FormContext = new FormContext(); 
}

辅导员本

作为我问题第二部分的答案,显然您不能在表单上调用 jquery.validate.unobtrusive.parse 两次。 如果表单已经有一个验证器,它不会被替换。

打算给辅导员本接受的答案,因为他的位是迄今为止最难的位:D

编辑

哦,看来我也不是第一个找到它的:

http://xhalent.wordpress.com/2011/01/24/applying-unobtrusive-validation-to-dynamic-content/

像这些行添加不显眼的:

1) $.validator.unobtrusive.parse($('#yourformid'));

2) var $form1 = $('#workOrderDetails');

3) if ($form1.valid()) {  //your ajax or your code comes here }

我假设您已经为消息添加了验证摘要或验证消息。

暂无
暂无

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

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