Постоянные ошибки между контроллерами - PullRequest
2 голосов
/ 26 июля 2011

У меня вопрос по ASP .Net MVC.У меня есть форма регистрации электронной почты на моей главной странице (панель инструментов), в ней есть текстовое поле для электронной почты и кнопка для отправки электронного письма на мой домашний контроллер.

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

Если ошибок нет, электронное письмо сохраняется и пользователь отправляетсяна завершенную страницу успешно.

Сначала я подумал, что могу сохранить ошибки в TempData, а затем проверить, имеет ли оно значение где-нибудь в файле действия или базовом классе Controller, и добавить его в новый Controller ModelState.

Я хотел бы знать, есть ли другой способ или лучший способ, или даже если отправка ошибки в TempData является хорошей практикой вообще.

Спасибо.

Ответы [ 2 ]

1 голос
/ 26 июля 2011

Обычный шаблон действия POST выглядит следующим образом:

[HttpPost]
public ActionResult Foo(MyModel model)
{
    if (!ModelState.IsValid)
    {
        // if there were some validation errors redisplay the form so that
        // the user can fix them
        return View(model);
    }

    // At this stage we know that the model is valid => we may try do some
    // processing on it:
    if (!Repository.TryDoSomeProcessing(model))
    {
        // Something wen wrong with our processing => redisplay the form
        // to inform the user of this
        ModelState.AddModelError("foo", "bar");
        return View(model);
    }

    // at this stage we know that the processing succeeded => we may redirect
    // there will no longer be error messages. We could at maximum use TempData
    // to store some success message:
    TempData["message"] = "Thank you for submitting!";
    return RedirectToAction("Success");
}

Конечно, если вы нарушаете этот шаблон и хотите перенаправить его из-за постоянных ошибок и т. Д., Вы сами по себе.Я видел людей, которые борются с TempData, Sessions, Cache, ... с постоянными ошибками между перенаправлениями.Я предпочитаю оставлять эти методы без комментариев.

0 голосов
/ 18 ноября 2011

Я имел большой успех, используя TempData для сохранения ModelState между перенаправлениями, и очень рекомендую его!

В проекте MvcContrib есть хороший помощник, который позволяет легко сохранять и восстанавливать ModelState в TempData с помощью фильтров действий.

Однако для наших проектов мы хотели ручное управление, поэтому мы создали методы расширений для TempData, чтобы мы могли использовать следующий код:

TempData.SaveModelState(ModelState);
return Redirect...;

И восстановить:

TempData.RestoreModelState(ModelState);

Таким образом, наш веб-сайт никогда не отображает представление из недействительного POST, он всегда перенаправляет на GET.

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