2009-08-04 17 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"); 
} 

To nie zachowuje tekstu "info" w viewdata po przekierowaniuDotyczy. Jak obejść ten problem w najbardziej elegancki sposób?Zachowaj viewdata na RedirectToAction

Mój obecny pomysł polega na umieszczeniu rzeczy z kontrolera Index w [NonAction] i wywołaniu tej metody zarówno z akcji Index, jak i akcji CreateUser, ale mam wrażenie, że musi być lepszy sposób.

Dzięki.

Odpowiedz

57

Można użyć TempData.

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

TempData istnieje dokładnie w tej sytuacji. Używa sesji jako pamięci, ale nie będzie po drugiej odpowiedzi.

Od MSDN:

Typowym zastosowaniem dla obiektu TempDataDictionary jest przeniesienie danych z metody działania, kiedy to przekierowuje do innej metody działania. Na przykład metoda działania może przechowywać informacje o błędzie w właściwości TempData kontrolera (który zwraca obiekt TempDataDictionary), zanim wywoła metodę RedirectToAction. Następna metoda działania może następnie obsłużyć błąd i renderować widok wyświetlający komunikat o błędzie.

+0

Interesujące, nigdy o nim nie słyszałem. :-) –

+2

To jest bummer, że musisz użyć "TempData" również w widoku i nie możesz dalej używać ViewData tam. Ale działa dobrze, więc dzięki. –

+0

Zobacz metodę kopiowania rozszerzeń http: //blog.eworldui.net/post/2008/06/MVC-Post-Redirect-Get-Sample-Updated.aspx –

10

Użyj ViewData, jeśli twoje dane powinny być dostępne w View podczas "tego" żądania. Użyj `TempData ', jeśli twoje dane dotyczą" następnego "(na przykład: POST-REDIRECT-GET design pattern).

+3

+1 dla wzoru PRG –

2

Jeśli potrzebujesz tego więcej niż raz, dobrym rozwiązaniem byłoby utworzenie ActionFilterAttributes, które eksportuje/importuje tempdata do viewdata i na odwrót. Możesz równie dobrze przekazać swój modelState w ten sposób (demonstracja here - # 13). Po wprowadzeniu kilku poprawek do tego fragmentu kodu, miałbym czyste rozwiązanie.

0

Ponieważ TempData wydaje się używać przechowywania i wszelkie formy ITempDataProvider że nie jest „w procesie”, wymaga obiekt będzie Serializable, TempData wydaje się zdecydowanie niewystarczająca w sytuacji gospodarstw internetowej ... (ViewDataDictionary nie jest sama serializable ...) Czy ktoś ma jakieś sugestie na ten temat?

2

Można użyć właściwości kontrolera TempData, ale ma tę wadę, że używa pamięci sesji w tle. Oznacza to, że będziesz potrzebował dodatkowej pracy, aby mógł działać na farmie internetowej, a przede wszystkim musisz włączyć sesje w swojej aplikacji.

Alternatywą jest użycie plików cookie, jeśli potrzebujesz tylko transportu krótkiej wiadomości. To wymaga odpowiedniego szyfrowania pliku cookie. Nie poleganie na właściwości TempData umożliwia również ustawienie wiadomości w kontekście innym niż MVC, na przykład na klasycznej stronie ASHX.

Spójrz na FlashMessage, dzięki czemu możesz zaoszczędzić trochę pracy wykonującej to samodzielnie.

Powiązane problemy