2008-08-20 10 views
5

Lorsqu'un contrôleur rend une vue basée sur un modèle, vous pouvez obtenir les propriétés de la collection ViewData à l'aide de l'indexeur (par exemple, ViewData ["Property"]). Cependant, j'ai un contrôle utilisateur partagé que j'ai essayé d'appeler en utilisant les éléments suivants:Contrôle d'utilisateur MVC Asp.net ViewData

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

et mon contrôle du message j'ai eu ceci:

<%= ViewData["DisplayMessage"] %> 

Je pense cela rendrait correctement le DisplayMessage, cependant, null est retourné. Après une forte dose de bricoler, j'ai finalement créé une classe « MessageData » afin de typer mon contrôle utilisateur:

public class MessageControl : ViewUserControl<MessageData> 

et maintenant cet appel fonctionne:

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

et peut être affiché comme ceci:

<%= ViewData.Model.DisplayMessage %> 

Pourquoi pas la propriété DisplayMessage être ajouté à la collection ViewData (c.-à-ViewData [ "DisplayMessage"].) sans typage fort le contrôle de l'utilisateur? Est-ce par conception? Ne serait-il pas logique que ViewData contienne une clé pour "DisplayMessage"?

Répondre

6

La méthode

ViewData.Eval("DisplayMessage") 

devrait travailler pour vous.

2

Bien sûr après avoir créé cette question, je trouve immédiatement la réponse après quelques recherches sur Google

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

Apparemment, cela se produit à cause de la classe wrapper. Même ainsi, il semble que toute propriété transmise devrait être ajoutée à la collection ViewData par défaut.

je vraiment besoin d'arrêter de répondre à mes propres questions :(