Cannot apply indexing with [] to an expression of type 'System.Dynamic.DynamicObject'
Solution 1
Have you tried
ViewBag.SuccessBody = TempData["successBody"];
Solution 2
ViewBag is a dynamic wrapper for ViewData, so these two statements are the same:
ViewBag.SuccessBody = TempData["successBody"];
ViewData["SuccessBody"] = TempData["successBody"];
Solution 3
ViewBag
and ViewData
seem kind of interchangable, but there are different rules as to how you access the data inside of them. Your issue pops up when you try to index into a ViewBag
, which doesn't work.
For ViewBag
, you dereference the items with a dot, like this.
ViewBag.MyItem
However, with ViewData
, you access the items by indexing the appropriate key from the key value dictionary like this.
ViewData["MyItem"]
Comments
-
RealityDysfunction about 4 years
When I try to assign a value to the ViewBag I get the following error:
Cannot apply indexing with [] to an expression of type 'System.Dynamic.DynamicObject'
My code is as follows:
public ActionResult Success() { ViewBag["SuccessBody"] = TempData["successBody"]; return View(); }
PS: Why I do this you may ask? Because I am redirecting to the Success action and I needed something that persists across redirects. Then, I am assigning the value to ViewBag in order to pass the Value to a 'shared' view.
-
RealityDysfunction over 10 yearsThat was it! Thank you sir.
-
Jeroen Vannevel over 10 yearsWhat's the reason you can't use an indexer?
-
Chris Woolum over 10 yearsDynamicObjects do not expose their children as an array directly. This is just how it was designed. msdn.microsoft.com/en-us/library/…
-
Jeroen Vannevel over 10 yearsAh I see, it's easy to miss. So a
ViewBag
can access them as dynamic properties, whileViewData
can access them with an indexer? -
Chris Woolum over 10 yearsYes, Viewdata is a ViewDataDictionary which implements the interface IDictionary. That is why you can use an indexer on it.