Ненавязчивая проверка не работает в динамически добавленном частичном представлении - PullRequest
42 голосов
/ 17 февраля 2012

В настоящее время у меня возникла проблема с проверкой после динамического добавления содержимого.

Я строго придерживаюсь модели (Order). В этом заказе может быть много предметов. Модель выглядит примерно так:

public class Order
{
    [Key]
    [HiddenInput]
    public int id { get; set; }

    [Display(Name = "Order Number")]
    public string number { get; set; }

    [Display(Name = "Order Date")]
    [DataType(DataType.Date)]
    [DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:MM/dd/yyyy}")]
    public DateTime date { get; set; }

    [Required(ErrorMessage = "Beneficiary is required.")]
    [Display(Name = "Beneficiary")]
    public int beneficiary_id { get; set; }

    [Display(Name = "Beneficiary")]
    public Beneficiary beneficiary { get; set; }

    [Display(Name = "Items")]
    public List<Item> items { get; set; }

    [Display(Name = "Payment Method")]
    public List<PaymentMethod> payment_methods { get; set; }
}

Я ввожу информацию о заказе, а также элементы для этого конкретного заказа. Я попробовал несколько способов динамического добавления контента и, наконец, пошел по пути Стивена Сандерсона .

На мой взгляд, у меня есть обычная информация о Заказе, а затем элементы, где моя модель выглядит примерно так:

@model trackmeMvc.Models.Model.Order
@{
    ViewBag.Title = "Create";
    Html.EnableClientValidation();
    Html.EnableUnobtrusiveJavaScript();
}

<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>

<script src="@Url.Content("~/Scripts/MicrosoftAjax.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/MicrosoftMvcAjax.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/MicrosoftMvcValidation.js")" type="text/javascript"></script>

@using (Html.BeginForm("Create", "Order", FormMethod.Post, new { @id = "create_order" }))
    {
    @Html.ValidationSummary(true, "Order creation was unsuccessful. Please correct the errors and try again.")

    <div class="editor-label">
        @Html.LabelFor(m => m.date)<req>*</req>
    </div>
    <div class="editor-field">
        @Html.TextBoxFor(m => m.date, new { @id = "order_date" })<br />
        @Html.ValidationMessageFor(m => m.date)
    </div>

...

<script type="text/javascript">

    $(document).ready(function () {

        $("#addItem").click(function () {

            var formData = $("#main_div").closest("form").serializeArray();

            $.ajax({
                url: "/IPO/BlankItemRow",
                type: "POST",
                //data: formData,
                cache: false,
                success: function (html) {
                    $("#editorRows").append(html);
                        //$.validator.uobtrusive.parseDynamicContent("form *");
                        //$("#editorRows").removeData("validator");
                        //$("#editorRows").removeData("unobtrusiveValidation");
                        //$.validator.unobtrusive.parse("#editorRows");
                        //$.validator.unobtrusive.parse("#create_ipo");
                        //$.validator.unobtrusive.parseDynamicContent($(this).first().closest("form"));
                        //$.validator.unobtrusive.parse($("#new_ipo_item"));

                        //$.validator.unobtrusive.parseElement($("#editorRows").find(".editRow:last").children().find("select"));
                           //$("#editorRows").find(".editRow:last").find("select").each(function () {
                           //alert($(this).attr("id"));
                           //$.validator.unobtrusive.parseElement($(this));
                           //$.validator.unobtrusive.parseDynamicContent($(this));
                           //$.validator.unobtrusive.parseDynamicContent($(this).attr("name"));
                       //});
                           //$("#editorRows").children().find(".editRows:last").find("*").each(function () {
                           //  alert($(this).attr('id'));

                           //$.validator.unobtrusive.parseDynamicContent('input');
                       //});
                       //var form = $(this).closest("form").attr("id");
                       //$(form).removeData("validator");
                       //$(form).removeData("unobtrusiveValidation");
                       //$.validator.unobtrusive.parse(form);
                    }
                });
            return false;
        });
    });

</script>

Это некоторые из вещей, которые я пробовал, и ничего не работает.

Я получил parseDynamicContent от Применение ненавязчивой проверки jquery к динамическому содержимому в ASP.Net MVC . Я пробовал это в каждом сценарии, о котором только мог придумать, но все равно не повезло.

Я также пытался выполнить обычный анализ, удаляя проверку из формы, а затем применяя ее снова, но все еще добавленные элементы не проверяются:

<div id="editorRows">
    @foreach (var item in Model.items)
    {
        @Html.Partial("_NewItem", item)
    }
</div>

... и мой частичный вид будет выглядеть примерно так:

@model trackmeMvc.Models.Model.Item 

@{
    Layout = "";    
    Html.EnableClientValidation(true);

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

<div class="editRow">

@using (Html.BeginCollectionItem("order_items"))
{

    @Html.DropDownListFor(m => m.item_id, @items, "None", new { @style = "width:205px;", @id = "ddlItems", @class="ddlItem", @name="ddlItemList" })
    @Html.ValidationMessageFor(m => m.item_id)

    ...

}

</div>

Так что происходит, у меня есть один пустой элемент, отправленный из контроллера в представление по умолчанию, чтобы показать одну пустую строку. Этот элемент проверяется, но, что бы ни случилось после того, как я щелкну добавить элемент, появится другая строка из этого частичного, но я не могу его проверить. Я попытался поставить проверку в частичном представлении (до того, как документ был готов в основной форме), и все, что я прочитал, я применил, и это всегда заканчивается тем же: проверка первой строки, а не других. Я попробовал проверку Стивена Сандерсона, сделанную для этой цели - все еще не повезло - даже проверку для частичных версий, найденную по этой ссылке и следующая за ней страница, которая относится к частичной проверке ...

Что я должен сделать, чтобы эта проверка работала?

Ответы [ 2 ]

92 голосов
/ 17 февраля 2012

Хорошо, я собираюсь начать с нового ответа здесь.

Прежде чем позвонить $.validator.unobtrusive.parse, удалите исходный валидатор и ненавязчивую валидацию из формы следующим образом:

var form = $("#main_div").closest("form");
form.removeData('validator');
form.removeData('unobtrusiveValidation');
$.validator.unobtrusive.parse(form);

Этот же ответ задокументирован здесь .

1 голос
/ 16 марта 2018

Для меня работало повторное применение валидатора после вызова для загрузки частичного представления.В моем случае я использую $.post().then(), но вы могли бы сделать нечто подобное с .always() обратным вызовом вызова AJAX.

$.post(url, model, function (data) {
    //load the partial view
    $("#Partial").html(data);
}).then(function () {
    $("form").each(function () { $.data($(this)[0], 'validator', false); });
    $.validator.unobtrusive.parse("form");
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...