【问题标题】:Validation not working when using dynamically created PartialViews mvc5使用动态创建的 PartialViews mvc5 时验证不起作用
【发布时间】:2018-02-27 07:15:40
【问题描述】:

我有一个使用 BeginCollectionItem 和部分视图动态创建/删除项目(模型视图)的视图。动态创建的视图的验证未触发。 代码: 主视图:

 @model EnquiryVM
    @using (Html.BeginForm()) 
    {
        @Html.AntiForgeryToken()

        <div class="form-horizontal">

            @Html.ValidationSummary(true, "", new { @class = "text-danger" })

            <div class="form-group">
                @Html.LabelFor(model => model.EnquiryNumber, htmlAttributes: new { @class = "control-label col-md-2" })
                <div class="col-md-3">
                    @Html.EditorFor(model => model.EnquiryNumber, new { htmlAttributes = new { @class = "form-control" } })
                    @Html.ValidationMessageFor(model => model.EnquiryNumber, "", new { @class = "text-danger" })
                </div>
            </div>



            <div class="form-group">
                @Html.LabelFor(model => model.DivisionID, "Division", htmlAttributes: new { @class = "control-label col-md-2" })
                <div class="col-md-3">
                    @Html.DropDownListFor(u => u.DivisionID, (IEnumerable<SelectListItem>)Model.Divisions, "--Select--") 
                    @Html.ValidationMessageFor(model => model.DivisionID, "", new { @class = "text-danger" })
                </div>
            </div>



            <div id="LineItems">
                @using (Html.BeginForm())
                {
                    <div id="editorRowsLineitems">
                        @foreach (var item in Model.LineItems)
                        {
                            @Html.Partial("_CreateEnquiryItem", item)
                        }
                    </div>
                    @Html.ActionLink("Add Items", "CreateLineItem", null, new { id = "addItem", @class = "button" });
                }
            </div>
            <div class="form-group">
                <div class="col-md-offset-2 col-md-10">
                    <input type="submit" value="Create" class="btn btn-default" />
                </div>
            </div>
        </div>
    }


    @section Scripts {
        @Scripts.Render("~/bundles/jqueryval")
    <script type="text/javascript">
        $(function () {
            $('#addItem').on('click', function () {
                $.ajax({
                    url: '@Url.Action("CreateLineItem")',
                        cache: false,
                        success: function (html) { $("#editorRowsLineitems").append(html); }
                    });
                    return false;
                });
            $('#editorRowsLineitems').on('click', '.deleteRow', function () {
                    $(this).closest('.editorRow').remove();
                });
            $('form').data('validator', null);
            $.validator.unobtrusive.parse($('form'));
        });


    </script>
    }

部分视图:

@model EnquiryLineItemVM

<div class="editorRow">
    @using (Html.BeginCollectionItem("ItemList"))
    {
        <table class="table">

            @Html.ValidationSummary(true, "", new { @class = "text-danger" })

            <tr>
                <td>
                    @Html.EditorFor(model => model.ItemDesc)
                    @Html.ValidationMessageFor(model => model.ItemDesc, "", new { @class = "text-danger" })
                </td>
                <td>
                    @Html.EditorFor(model => model.Quantity)
                    @Html.ValidationMessageFor(model => model.Quantity, "", new { @class = "text-danger" })
                </td>

                <td>
                    @Html.DropDownListFor(model => model.ManufacturerId, Model.ManufacturerList, "--Please Select--")
                    @Html.ValidationMessageFor(model => model.ManufacturerId, "", new { @class = "text-danger" })
                </td>
                <td>

                    <a href="#" class="deleteRow">Delete</a>
                </td>
            </tr>
        </table>

    }
    </div>

视图模型:

 public class EnquiryLineItemVM
    {
        public int ID { get; set; }
        [Required]
        public string ItemDesc { get; set; }
       [Required]
        public int Quantity { get; set; }

    }

在这种情况下使用验证的类似问题在这里SO1 但没用。我在视图中引用了不显眼的验证和 Jquery 验证。 请帮忙。谢谢阅读 。

【问题讨论】:

  • 添加新项目的 html 后,您需要重新解析验证器。即在成功回调中 - 就像您链接到的答案一样(确实有效)。您当前仅在页面被渲染时才这样做,这是没有意义的。
  • 而且你还没有修复你在previous question中提到的所有其他错误
  • @StephenMuecke。再次感谢 。这并不是说我忽略了从 PartialView 中删除验证摘要的要点。我曾尝试保留并删除它,但它们都不起作用,实际上我已将您提供的重新解析脚本放在了成功函数之外。我的错。现在它完美地工作了。当验证摘要存在于部分视图中和没有时。非常感谢您提供的帮助
  • 不仅仅是@Html.ValidationSummary - 它是无效的嵌套形式和BeginCollectionItem()中的错误名称

标签: jquery validation asp.net-mvc-5 begincollectionitem


【解决方案1】:

当您动态添加到 DOM 时,Jquery 验证不起作用,因为它添加了验证中使用的属性。解决方法是在加载后再次调用它:

$('#addItem').on('click', function () {
    $.ajax({
        url: '@Url.Action("CreateLineItem")',
            cache: false,
            success: function (html) { 
                           $("#editorRowsLineitems").append(html); 
                           // clear and add validation attributes
                           $("form").removeData("validator");
                           $("form").removeData("unobtrusiveValidation");
                           $.validator.unobtrusive.parse("form");
                      }
        });
        return false;
    });

here

【讨论】:

  • 感谢您指出这一点。我已将验证器删除脚本放在成功功能之外。现在可以了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-10-24
  • 2015-06-26
  • 2018-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多