As I’ve stated before, and for those that know me, when working with C# I try to use the compiler as often as I can and keep things strongly typed. When I started working in MVC, I didn’t like the fact that TempData was defined like this:
public class TempDataDictionary : IDictionary<string, object>, ICollection<KeyValuePair<string, object>>, IEnumerable<KeyValuePair<string, object>>, IEnumerable
public class TempDataDictionary : IDictionary<string, object>, ICollection<KeyValuePair<string, object>>, IEnumerable<KeyValuePair<string, object>>, IEnumerable
public class TempDataDictionary : IDictionary<string, object>, ICollection<KeyValuePair<string, object>>, IEnumerable<KeyValuePair<string, object>>, IEnumerable
While TempData and ViewData being potentially valuable things, <string, object>, really?
Here is how I get around that and use the compiler to my advantage with some simple extension methods:
public static class TempDataExtensions
public static T Get<T>(this TempDataDictionary tempData, string key)
var tempDataItem = (T)tempData[key];
throw new InvalidCastException(string.Format("Temp Data does not contain type {0} for key {1}", typeof(T), key));
public static void Set<T>(this TempDataDictionary tempData, string key, T value)
public static class TempDataExtensions
{
public static T Get<T>(this TempDataDictionary tempData, string key)
{
if (tempData[key] is T)
{
var tempDataItem = (T)tempData[key];
return tempDataItem;
}
throw new InvalidCastException(string.Format("Temp Data does not contain type {0} for key {1}", typeof(T), key));
}
public static void Set<T>(this TempDataDictionary tempData, string key, T value)
{
tempData[key] = value;
}
}
public static class TempDataExtensions
{
public static T Get<T>(this TempDataDictionary tempData, string key)
{
if (tempData[key] is T)
{
var tempDataItem = (T)tempData[key];
return tempDataItem;
}
throw new InvalidCastException(string.Format("Temp Data does not contain type {0} for key {1}", typeof(T), key));
}
public static void Set<T>(this TempDataDictionary tempData, string key, T value)
{
tempData[key] = value;
}
}
So, in your controller, you can Set to TempData and Get from TempData like this:
public ActionResult Index()
TempData.Set("SomeObjectKey", new SomeObject());
TempData.Set("SomeBoolKey", true);
TempData.Set("SomeStringKey", "test");
TempData.Get<SomeObject>("SomeObjectKey"); // returns SomeObject
TempData.Get<bool>("SomeBoolKey"); // returns a boolean true
TempData.Get<string>("SomeStringKey"); // returns the string "test"
public ActionResult Index()
{
TempData.Set("SomeObjectKey", new SomeObject());
TempData.Set("SomeBoolKey", true);
TempData.Set("SomeStringKey", "test");
TempData.Get<SomeObject>("SomeObjectKey"); // returns SomeObject
TempData.Get<bool>("SomeBoolKey"); // returns a boolean true
TempData.Get<string>("SomeStringKey"); // returns the string "test"
return View();
}
public ActionResult Index()
{
TempData.Set("SomeObjectKey", new SomeObject());
TempData.Set("SomeBoolKey", true);
TempData.Set("SomeStringKey", "test");
TempData.Get<SomeObject>("SomeObjectKey"); // returns SomeObject
TempData.Get<bool>("SomeBoolKey"); // returns a boolean true
TempData.Get<string>("SomeStringKey"); // returns the string "test"
return View();
}
You can also do the same with ViewData:
public static class ViewDataExtensions
public static T Get<T>(this ViewDataDictionary viewData, string key)
var viewDataItem = (T)viewData[key];
throw new InvalidCastException(string.Format("View Data does not contain type {0} for key {1}", typeof(T), key));
public static void Set<T>(this ViewDataDictionary viewData, string key, T value)
public static class ViewDataExtensions
{
public static T Get<T>(this ViewDataDictionary viewData, string key)
{
if (viewData[key] is T)
{
var viewDataItem = (T)viewData[key];
return viewDataItem;
}
throw new InvalidCastException(string.Format("View Data does not contain type {0} for key {1}", typeof(T), key));
}
public static void Set<T>(this ViewDataDictionary viewData, string key, T value)
{
viewData[key] = value;
}
}
public static class ViewDataExtensions
{
public static T Get<T>(this ViewDataDictionary viewData, string key)
{
if (viewData[key] is T)
{
var viewDataItem = (T)viewData[key];
return viewDataItem;
}
throw new InvalidCastException(string.Format("View Data does not contain type {0} for key {1}", typeof(T), key));
}
public static void Set<T>(this ViewDataDictionary viewData, string key, T value)
{
viewData[key] = value;
}
}
I know what you are thinking, this doesn’t stop you from setting TempData the <string, object> way, and you are correct. To get and set using strong types, you have to have the discipline to use these extension methods. But, with these tools, you can give yourself a fighting chance.