If there was a single feature I would like to see in ASP.NET MVC 4 that would be to remove/deprecate ViewBag/ViewData. Those two constructs lead to very ugly code in the views and should be avoided. Here are few of the things I hate about them:
- They are not strongly typed and you need to cast in your views in order to obtain the actual type
- They are not refactor friendly because they rely on magic strings
- They lead to brittle unit tests because of the magic strings
- They lead to spaghetti code in the views
Here’s the diff patch I would love to see applied for the ViewDataDictionary.cs class in ASP.NET MVC 4:
diff --git ViewDataDictionary.cs ViewDataDictionary.cs index 4c6299f..1965e3e 100644 --- ViewDataDictionary.cs +++ ViewDataDictionary.cs @@ -95,12 +95,10 @@ namespace System.Web.Mvc { public object this[string key] { get { - object value; - _innerDictionary.TryGetValue(key, out value); - return value; + throw new Expcetion("Don't use ViewData"); } set { - _innerDictionary[key] = value; + throw new Expcetion("Don't use ViewData"); } }