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

redirectToAction 후에 뷰 정보에 "정보"텍스트를 보관하지 않습니다. 가장 좋은 방법으로이 문제를 해결하려면 어떻게해야합니까?redirectToAction에 대한 뷰 데이터 유지

나의 현재 아이디어는 [NonAction]에있는 Index 컨트롤러 작업의 항목을 넣고 인덱스 작업과 CreateUser 작업 모두에서 해당 메서드를 호출하는 것이지만 더 나은 방법이 있어야한다는 느낌이 들었습니다.

감사합니다.

답변

57

TempData을 사용할 수 있습니다.

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

TempData이이 상황에 대해 정확히 존재합니다. 세션을 저장소로 사용하지만 두 번째 응답 이후에는 세션을 사용하지 않습니다. MSDN에서

:

TempDataDictionary 객체에 대한 일반적인 사용은 다른 동작 방법에 재전송시 동작 방법에서 데이터를 전달하는 것이다. 예를 들어, 작업 메서드는 RedirectToAction 메서드를 호출하기 전에 오류에 대한 정보를 컨트롤러의 TempData 속성 (TempDataDictionary 개체를 반환 함)에 저장할 수 있습니다. 다음 조치 메소드는 오류를 처리하고 오류 메시지를 표시하는보기를 렌더링합니다.

+0

재미 있고, 들어 본 적이 없습니다. :-) –

+2

보기에서 "TempData"를 사용해야한다는 사실이 부끄럽기 때문에 ViewData를 계속 사용할 수 없습니다. 하지만 멋지게 작동합니다. 감사합니다. –

+0

복사 확장 방법 http : //blog.eworldui를 참조하십시오.net/post/2008/06/MVC-Post-Redirect-Get-Sample-Updated.aspx –

10

"this"요청 중에 데이터가 View에 액세스 할 수 있어야하는 경우 ViewData을 사용하십시오. 데이터가 "다음"요청 (예 : POST-REDIRECT-GET design pattern) 인 경우에는 'TempData'를 사용하십시오.

+3

+1 PRG 패턴 용 –

2

두 번 이상이 작업이 필요한 경우 임시 해결 방법은 tempdata를 뷰 데이터로 내보내거나 그 반대로 내보내는 ActionFilterAttributes를 만드는 것입니다. 이 방법으로 ModelState를 매우 잘 전달할 수 있습니다 (here - # 13). 코드 조각을 약간 조정하면 깨끗한 솔루션을 얻을 수 있다고 생각합니다.

0

TempData는 저장소를 사용하고 있으며 "처리 중"이 아닌 ITempDataProvider의 모든 형식은 개체를 Serializable해야한다고 가정하기 때문에 TempData는 웹 팜 상황에서 부적절합니다. (ViewDataDictionary 자체가 직렬화되지 않습니다. ...) 누구든지 이것에 대한 제안이 있습니까?

2

TempData 컨트롤러 속성을 사용할 수 있지만 백그라운드에서 세션 저장소를 사용한다는 단점이 있습니다. 즉, 웹 팜에서 작동하도록 추가 작업을하고 응용 프로그램에서 세션을 활성화해야합니다.

짧은 메시지 만 전송해야하는 경우 쿠키를 사용하는 방법이 있습니다. 쿠키를 올바르게 암호화해야합니다. TempData 속성에 의존하지 않으면 클래식 ASHX 페이지와 같이 비 MVC 컨텍스트에서 메시지를 설정할 수도 있습니다.

직접 구현하는 작업을 줄일 수있는 FlashMessage을 살펴보십시오.

관련 문제