2009-08-04 4 views
30
[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult CreateUser([Bind(Exclude = "Id")] User user) 
{ 
     ... 
     db.SubmitChanges(); 
     ViewData["info"] = "The account has been created."; 
     return RedirectToAction("Index", "Admin"); 
} 

Это не сохраняет текст «info» в viewdata после redirectToAction. Как я могу обойти эту проблему самым элегантным способом?keep viewdata on RedirectToAction

Моя текущая идея состоит в том, чтобы поместить материал из управления Index Index в [NonAction] и вызвать этот метод как из действия индекса, так и в действие CreateUser, но у меня есть ощущение, что должен быть лучший способ.

Спасибо.

ответ

57

Вы можете использовать TempData.

TempData["info"] = "The account has been created.".

TempData есть точно в этой ситуации. Он использует сеанс как хранилище, но после второго ответа его не будет.

Из MSDN:

Типичное использование для объекта TempDataDictionary состоит в передаче данных от метода действия, когда он перенаправляет к другому методу действия. Например, метод действия может хранить информацию об ошибке в свойстве TempData контроллера (который возвращает объект TempDataDictionary) перед вызовом метода RedirectToAction. Затем следующий метод действия может обрабатывать ошибку и отображать представление, отображающее сообщение об ошибке.

+0

Интересно, никогда не слышал об этом. :-) –

+2

Это облом, что вам тоже нужно использовать «TempData», и я не могу просто использовать ViewData. Но он работает красиво, поэтому спасибо. –

+0

См. Способ расширения копии http: //blog.eworldui.net/post/2008/06/MVC-Post-Redirect-Get-Sample-updated.aspx –

10

Используйте ViewData, если ваши данные должны быть доступны в View во время запроса «этот». Используйте «TempData», если ваши данные для «следующего» запроса (например, POST-REDIRECT-GET design pattern).

+3

+1 для шаблона PRG –

2

Если вам это нужно более одного раза, хорошим решением будет создание ActionFilterAttributes, который экспортирует/импортирует tempdata в viewdata и наоборот. Вы можете передать свой ModelState таким же образом очень хорошо (продемонстрировано here - # 13). С некоторыми корректировками к этому фрагменту кода у вас будет чистое решение, я думаю.

0

Поскольку TempData, как представляется, использует хранилище, и любая форма ITempDataProvider, которая не является «in-process», требует, чтобы объект был Serializable, TempData кажется крайне неадекватным в ситуациях веб-ферм ... (ViewDataDictionary сам по себе не сериализуется ...) У кого-нибудь есть предложения по этому поводу?

2

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

Альтернативой является использование файлов cookie, если вам нужно только передать короткое сообщение. Это требует правильного шифрования файла cookie. Не полагаясь на свойство TempData, вы также можете устанавливать сообщения в контексте, отличном от MVC, например, на классической странице ASHX.

Посмотрите на FlashMessage, который может сэкономить вам некоторые работы, реализующие это самостоятельно.

 Смежные вопросы

  • Нет связанных вопросов^_^