title: Asp.net MVC User Control ViewData
body: <p>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:</p>
  
  <pre><code>return View("Message", new { DisplayMessage = "This is a test" });
  </code></pre>
  
  <p>and on my Message control I had this:</p>
  
  <pre><code>&lt;%= ViewData["DisplayMessage"] %&gt;
  </code></pre>
  
  <p>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:</p>
  
  <pre><code>public class MessageControl : ViewUserControl&lt;MessageData&gt;
  </code></pre>
  
  <p>and now this call works:</p>
  
  <pre><code>return View("Message", new MessageData() { DisplayMessage = "This is a test" });
  </code></pre>
  
  <p>and can be displayed like this:</p>
  
  <pre><code>&lt;%= ViewData.Model.DisplayMessage %&gt;
  </code></pre>
  
  <p>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"?</p>