js в модале перестает работать после сбоя валидации сервера ASP.NET MVC Core - PullRequest
2 голосов
/ 06 марта 2019

Я работаю над корпоративным веб-приложением, созданным с использованием .NET Core 2.0, и получаю довольно неожиданные результаты, когда отправленная форма не проходит проверку.Я создаю модальное событие клика, которое заполняется формой, которая находится в частичном представлении.Частичное представление ссылается на внешний файл js, и все работает, как и ожидалось, пока форма находится в неподтвержденном или в допустимом состоянии.

Однако становится странным, когда я отправляю неверные данные через указанную форму.Проверка на стороне сервера делает свое дело, и сообщения об ошибках возвращаются в форму, как и положено.Проблема в том, что после отображения сообщений об ошибках ни один из других js, используемых для формы, не работает.

Теперь для кода.Вот js, который создает модальное и отправляет форму через site.js-

$(function () {
// stores the current URL in a variable to use for data update on modal. 
var placeholderElement = $('#modal-placeholder');

$('.trigger-ajax-modal[data-toggle="ajax-modal"]').click(function (event) {
    var url = $(this).data('url');
    $.get(url).done(function (data) {
        placeholderElement.html(data);
        placeholderElement.find('.modal').modal('show');
    });
});

placeholderElement.on('click', '[data-save="modal"]', function (event) {
    event.preventDefault();

    var form = $(this).parents('.modal').find('form');
    var actionUrl = form.attr('action');
    var dataToSend = form.serialize();

    $.post(actionUrl, dataToSend).done(function (data) {
        var newBody = $('.modal-body', data);
        placeholderElement.find('.modal-body').replaceWith(newBody);
        var isValid = newBody.length;
        if (isValid < 1) {
            placeholderElement.find('.modal').modal('hide');
            location.reload();
        }
    });
});

Теперь для js, который останавливается после отображения ошибок проверки -

$(document).ready(function () {    // <--works before form submission

//various code to do things like dynamically populate input via AJAX call based on a drop down list
// and doing simple arithmetic to avoid user error  

}); // <-- not so much after form is returned as invalid

Метод HttpPOSTв моем контроллере -

[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Create(MileageTrackerEditVM vm)
{
    try
    {
        if (ModelState.IsValid)
        {
            var dto = _mapper.Map<MileageTrackerDto>(vm);
        await _mileageTrackerSvc.UpdateMileageTracker(dto);
        return RedirectToAction(nameof(Index));
    }
    return PartialView("_Create", vm);
    }
    catch (Exception ex)
    {
    Console.WriteLine("An general error has occured while trying to create a mileage entry: {0}", ex.Message);
    throw;
    }
}

и, конечно, тег сценариев проверки в нижней части частичного представления, который используется для модального -

@section Scripts {
@{await Html.RenderPartialAsync("_ValidationScriptsPartial");}
}
<script type="text/javascript" src="~/scripts/MileageTrackers.js"></script>

Теперь для некоторых вариантов ямы попробовали -

  • добавив файл page.js в site.js (где живет js, запускающий модальное создание), а затем сослались на site.js в частичном.Тот же результат

  • запись JS непосредственно в партиал в тегах ... тот же результат

  • добавление JavaScript в бритву @section Сценариибит, используя @Scripts.Render("~/scripts/ myJavaFile.js").Это не только не работает, но даже не компилируется.

  • Кроме того, при отладке на стороне клиента, насколько я могу судить, файл js неотображается с сообщениями проверки.

Я искал верхний и нижний значения для способа отображения внешнего js-файла после сбоя проверки формы.Я не буду перечислять каждую последнюю перестановку фразы «js не работает после ошибки проверки формы» и другие способы описать мою проблему, но давайте просто оставим это в LOT.У меня нет идейисправить, я смиренно извиняюсь.Заранее благодарим за любое направление, которое вы можете предоставить.

1 Ответ

0 голосов
/ 11 марта 2019

Как написано в моем комментарии.Проблема в том, что скрипты удваиваются, потому что они не заменены должным образом.

Решение состоит в том, чтобы заменить корневой элемент метода PartialView.Предлагаю попробовать placeholderElement.html(newBody); в вашем посте методом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...