2010-04-04 1 views
2

После шаблона Post-Redirect-Get, как описано в разных местах, но, возможно, наиболее подробно here by Stephen Walter, я хочу использовать RedirectToAction, но он не принимает параметр для отправки объекта к нему. Я могу отправлять значения маршрута только как объект или как RouteValueDictionary. Поэтому в настоящее время я посылаю идентификатор объекта и тип и вытаскиваю объект из хранилища данных снова в действии, к которому я перенаправил (например, результаты).PRG в ASP.NET MVC, но с данными объекта, переданными перенаправленному действию

// redirect to confirm view 
return RedirectToAction("ChangeSuccess", "Redirect", 
    new { slug = tabgroup.Slug, contentType = tabgroup.ContentType }); 

Но я хотел бы послать объект там, потому что уже есть в моем обновлении действия контроллера, так что я не нужен, чтобы вытащить его снова.

Возможно ли это как-то?

ответ

1

См here.

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

+1

Подумав об этом некоторое время, я решил передать параметры, как я это делал до сих пор. Единственное различие заключается в том, что теперь я использую строго типизированный RedirectToAction из MVCContrib, который делает вещи более склонными к ошибкам и понятными для понимания. – mare

2

У вас read this

... One of the issue with this pattern is when a validation fails or any exception occurs you have to copy the ModelState into TempData. If you are doing it manually, please stop it, you can do this automatically with Action Filters...

Его номер 13. Используйте PRG шаблон для модификации данных

0

Вы не можете передать объект в URL-адрес GET.

С RedirectToAction метод выпускает новый GET Запрос на сервер.

Однако вы можете передать параметр query string для получения URL-адреса. Поэтому, пожалуйста, попробуйте передать id, как предложила королева.

Чтобы сохранить свой объект между последующим запросом, я настоятельно рекомендую вам использовать TempData. Однако он внутренне использует сеанс, но он убивает сразу после запроса.