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

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

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

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

<% 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? "True": "False"). Он всегда отображается как true, хотя переменная имеет значение false и скрывает всплывающее окно. Что происходит?

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

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

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

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

1 Ответ

0 голосов
/ 10 февраля 2010

Основная причина этой проблемы связана с тем, как 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 никогда не обновлялся значениями формы из предыдущего поста назад.

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