Temporarily Storing a View Model During a Post-Redirect-Get August, 2010
MVC enables you to cache data across requests using the TempData dictionary. This is handy when your doing a post-redirect-get:
[HttpPost] public ActionResult Register(UserRegistration registration) { // ... TempData["user-registration"] = registration; return RedirectToAction("RegisterSuccess"); } public ActionResult RegisterSuccess() { return View(TempData["user-registration"]); }
Since this is so common why not have a type safe method sans magic strings:
[HttpPost] public ActionResult Register(UserRegistration registration) { // ... TempData.Model<UserRegistration>().Current = registration; return RedirectToAction("RegisterSuccess"); } public ActionResult RegisterSuccess() { return View(TempData.Model<UserRegistration>().Current); }
Here is the implementation:
public static class TempDataDictionaryExtensions { public static TempModelContext<T> Model<T>(this TempDataDictionary tempData) { return new TempModelContext<T>(tempData); } public class TempModelContext<T> { private readonly TempDataDictionary _tempData; private readonly string _key = "__TYPE#" + typeof(T).Name; public TempModelContext(TempDataDictionary tempData) { _tempData = tempData; } public T Current { get { return _tempData.ContainsKey(_key) ? (T)_tempData[_key] : default(T); } set { _tempData[_key] = value; } } } }