Помогите выяснить, почему механизм рендеринга ASP.NET MVC выдает неожиданные результаты HTML.

StackOverflow https://stackoverflow.com/questions/2225552

  •  19-09-2019
  •  | 
  •  

Вопрос

У меня есть модальное всплывающее окно с формой.При отправке через ajax (с использованием jQuery) форма проверяется, а функция обратного вызова javascript проверяет, действительна ли модель.Если это так, модальное всплывающее окно сбрасывается и скрывается, если нет, текст ответа HTML выгружается в div модального всплывающего окна, чтобы пользователь мог увидеть ошибку.

Я делаю это в ASP.NET MVC, используя jQuery ajaxSubmit и действие, которое принимает только команду POST и возвращает PartialViewResult.Я делаю это в нескольких местах своего сайта, но у меня возникают проблемы с двумя такими рабочими процессами на одной странице.Один работает, другой нет, используя идентичный код.

Вот проблема:

<% using (Html.BeginForm("ApplyPayment", "SomeController", FormMethod.Post, new { @id = "frmApplyPayment" })) { %>
    <%= Html.AntiForgeryToken(SomeSaltString) %>
    <%= Html.Hidden("ModelValid", ViewData.ModelState.IsValid) %>
    ...
<% } %>

Во время отладки, даже несмотря на то, что ViewData.ModelState.IsValid имеет значение false при наличии ошибок проверки, для параметра #ModelValid устанавливается значение «True»!Я пробовал много способов явно установить для него значение false (например, ViewData.ModelState.IsValid?"Истинный" :"ЛОЖЬ").Это всегда оказывается правдой, даже если переменная имеет значение false и скрывает всплывающее окно. Что происходит?

Вот еще код для справки:

function SubmitPaymentForm(form) {
    $(form).ajaxSubmit({ target: "#modalApplyPayment", success: CheckPaymentValidity  });
}

function CheckPaymentValidity(responseText) {
    if ($("#ModelValid").val() != "True") {
        ShowModalPopup("#modalApplyPayment");
    }
    else {
        HideModalPopup("#modalApplyPayment");
    }
}

Все это полностью работает для очень похожего рабочего процесса на той же базовой странице для функций электронной почты (всплывающее окно, которое принимает адрес, проверяет сообщение ajax, показывает всплывающее окно, если существует ошибка проверки).

Это было полезно?

Решение

Основная причина этой проблемы связана с тем, как ModelState используется во время обратной передачи и повторной отрисовки страницы.Моя система проверки использует этот метод:

TrasnferValidationMessagesTo(ModelStateDictionary modelState,
                             IList<IValidationResult> results,
                             FormCollection formValues)
{
    // Set the ModelValue in modelState for each key in formValues

    // Add a ModelError for each error in results
}

Я считаю, что механизм ASP предназначен для использования значений коллекции ModelState для повторного заполнения значений формы.Это тайно переопределит мою явную настройку скрытого поля «#ModelState» (поскольку скрытые поля фиксируются в ответах формы).

Удивительно, но я обнаружил, что если мой ModelState сохранит значение «True» для «#ModelValid» из предыдущего поста, и я попытаюсь явно установить для него значение «False» с помощью кода, это не сработает.Но если я изменил его, начав с «Ложь» и установив значение «Истина», все сработало нормально.

Мое решение заключалось в том, чтобы добавить свойство ModelValid в мою модель представления, установить для него значение по умолчанию false и установить для него значение true, когда нет ошибок проверки, и использовать его для изменения «#ModelValid».У меня не было такой же проблемы с другим модальным всплывающим окном, потому что там я использовал ручную проверку, и ModelState никогда не обновлялся значениями формы из предыдущего поста.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top