Сбросить/переинициализировать ненавязчивую проверку jQuery для динамических AJAX-форм, чтобы очистить старые правила проверки

avatar
Christoph Fink
9 августа 2021 в 06:44
100
0
0

Я использую ASP.NET MVC 5 в сочетании с проверкой на стороне клиента и формами в модальных диалогах, загружаемых через AJAX.
Все это работает нормально, НО, если я открываю и публикую много этих диалогов/форм без перезагрузки страницы, каждая отправка становится все медленнее и медленнее, потому что (по крайней мере, я думаю) проверка все еще пытается проверить все прошлые формы, и это занимает некоторое время. Я пришел к такому выводу, потому что у меня есть индикатор «Загрузка ...», который появляется, как только начинается отправка, и время между нажатием кнопки «Отправить» и отображением индикатора увеличивается от отправки к отправке.

Есть ли способ полностью повторно инициализировать проверку на стороне клиента, чтобы избежать этой проблемы?

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

Я не использую никакого специального кода, только формы MVC по умолчанию (упрощенные):

@model MyModel

@section Scripts {  
    @Scripts.Render("~/bundles/jqueryval")  
}

@using (Html.BeginForm("MyAction", "MyController", FormMethod.Post,
             new { id = "MyForm", enctype = "multipart/form-data" }))
{
    @Html.EditorFor(m => m.MyValue)
    @Html.ValidationMessageFor(m => m.MyValue)
    <input type="submit" class="my-class" value="@Resources.Submit" />
}

<script type="text/javascript">
    $(document).ready(function() {
        $('#MyForm').submit(function(e) {
            e.preventDefault();

            if ($('#MyForm').valid()) {
                var formValues = $('#MyForm').serialize();
                $.post("@Url.Action("MyAction", "MyController")", formValues, function (result) {
                    if (result.startsWith("OK")) {
                        formValueHasChanged = false;
                        closeOverlay();
                    } else {
                        alert(result);
                    }
                });
            }
        });
    });
</script>

С такой моделью:

public class MyModel
{
    [Required(ErrorMessageResourceName = nameof(RequiredAttribute), ErrorMessageResourceType = typeof(Resources.Content))]
    public string MyValue { get; set; }
}

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

ОБНОВЛЕНИЕ: Теперь я выполнил профилирование с помощью Chrome DevTools, чтобы убедиться, что проверка вызывает задержки: Profiling

Источник
Sparky
10 августа 2021 в 00:51
0

Почему вы проверяете сразу целую страницу форм? Где код?

Christoph Fink
10 августа 2021 в 05:28
0

@Sparky В коде нет ничего особенного, посмотрите мое редактирование ...

Sparky
11 августа 2021 в 17:44
0

"Я нашел решения только для очистки/повторной инициализации "одной формы" на экране". Пробовали ли вы такое же решение внутри .each(), чтобы вы могли создавать все формы одновременно? $('form').each(function() { $(this).....

Christoph Fink
11 августа 2021 в 17:48
0

@Sparky Других форм больше не существует, так как «оверлей-контейнер» заменяется после каждого вызова AJAX.

Ответы (0)