7

When a controller renders a view based on a model you can get the properties from the ViewData collection using the indexer (ie. ViewData["Property"]). However, I have a shared user control that I tried to call using the following:

return View("Message", new { DisplayMessage = "This is a test" });

and on my Message control I had this:

<%= ViewData["DisplayMessage"] %>

I would think this would render the DisplayMessage correctly, however, null is being returned. After a heavy dose of tinkering around, I finally created a "MessageData" class in order to strongly type my user control:

public class MessageControl : ViewUserControl<MessageData>

and now this call works:

return View("Message", new MessageData() { DisplayMessage = "This is a test" });

and can be displayed like this:

<%= ViewData.Model.DisplayMessage %>

Why wouldn't the DisplayMessage property be added to the ViewData (ie. ViewData["DisplayMessage"]) collection without strong typing the user control? Is this by design? Wouldn't it make sense that ViewData would contain a key for "DisplayMessage"?

Martijn Pieters
  • 1,048,767
  • 296
  • 4,058
  • 3,343
Ryan Eastabrook
  • 4,085
  • 5
  • 30
  • 35

2 Answers2

6

The method

ViewData.Eval("DisplayMessage") 

should work for you.

Robotnik
  • 3,643
  • 3
  • 31
  • 49
Haacked
  • 58,045
  • 14
  • 90
  • 114
2

Of course after I create this question I immediately find the answer after a few more searches on Google

http://forums.asp.net/t/1197059.aspx

Apparently this happens because of the wrapper class. Even so, it seems like any property passed should get added to the ViewData collection by default.

I really need to stop answering my own questions :(

Ryan Eastabrook
  • 4,085
  • 5
  • 30
  • 35