Как вернуть состояние модели из дочернего обработчика действия в ASP.NET MVC - PullRequest
4 голосов
/ 03 июня 2010

В моем движке блога у меня есть одно действие контроллера, которое отображает содержимое блога, и в этом представлении я вызываю Html.RenderAction (...), чтобы отобразить форму «CreateComment». Когда пользователь публикует комментарий, сообщение обрабатывается контроллером комментариев (а не контроллером блога).

Если данные комментария верны, я просто возвращаю Redirect обратно на URL страницы блога.

Если данные комментария недействительны (например, тело комментария пусто), я хочу вернуть ViewData с информацией об ошибке обратно в контроллер блога и через представление блога в действие / представление CreateComment, чтобы я мог отобразить, какие поля являются плохой.

У меня это работает нормально через AJAX, когда Javascript включен, но сейчас я работаю над случаем, когда Javascript может быть отключен.

Если я возвращаю RedirecToAction или Redirect из контроллера комментариев, информация о состоянии модели теряется.

Есть идеи?

Ответы [ 3 ]

3 голосов
/ 03 июня 2010

Вы можете сохранить свой ModelState или ViewData (который содержит ModelState) в TempData перед выполнением перенаправления, а затем извлечь его:

// In your CreateComment action before redirect
if (!ModelState.IsValid)
{
    TempData["ViewData"] = ViewData;
}

// In your Blog controller's action to which you redirected
if (null != TempData["ViewData"])
{
    ViewData = (ViewDataDictionary)TempData["ViewData"];
}

В качестве альтернативы, вы можете создать свои собственные RouteData, установить «controller» и «action», очистить Response, захватить this.Context и вывести его в новый RequestContext, создать новый IController с помощью ControllerBuilder, используя данные маршрута, которые вы создали перед, а затем переписать ваш путь и выполнить контроллер, используя новый контекст запроса. Где-то там вы должны будете сбросить свой ModelState для переноса. Я не пробовал, и это кажется излишним.

0 голосов
/ 03 июня 2010

Добавьте ошибки в TempData перед перенаправлением с помощью этого фильтра из MVCContrib:

http://www.jeremyskinner.co.uk/2008/10/18/storing-modelstate-in-tempdata-with-aspnet-mvc/

0 голосов
/ 03 июня 2010

Если в браузере включен Javascript, почему бы вам не установить немного информации о состоянии в представлении при выполнении вызова AJAX? Затем, когда вы отправляете сообщение в контроллер блога, контроллер блога узнает, был ли обработан ваш комментарий с помощью AJAX, или должен ли контроллер блога обрабатывать его сам.

Ваш метод контроллера блога должен будет принять объект ViewModel, который содержит вновь созданную информацию комментария.

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