Asp.net MVC Controllo utente ViewData


5

Quando un controller esegue il rendering di una vista in base a un modello, è possibile ottenere le proprietà dalla raccolta ViewData utilizzando l'indicizzatore (ad esempio ViewData ["Proprietà"]). Tuttavia, ho un controllo utente condiviso che ho provato a chiamare utilizzando il seguente:

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

e sul mio controllo Messaggio ho avuto questo:

<%= ViewData["DisplayMessage"] %> 

vorrei che questo renderebbe correttamente il DisplayMessage, tuttavia, viene restituito null. Dopo una forte dose di armeggiare intorno, ho finalmente creato una classe "MessageData" al fine di digitare con forza il mio controllo utente:

public class MessageControl : ViewUserControl<MessageData> 

e ora questa chiamata funziona:

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

e può essere visualizzato come questo:

<%= ViewData.Model.DisplayMessage %> 

Perché non avrebbe la proprietà DisplayMessage essere aggiunto al Viewdata (cioè Viewdata [ "DisplayMessage"].) collezione senza tipizzazione forte il controllo utente? È questo in base alla progettazione? Non avrebbe senso che ViewData contenga una chiave per "DisplayMessage"?

6

Il metodo

ViewData.Eval("DisplayMessage") 

dovrebbe funzionare per voi.


2

Naturalmente dopo che ho creare questa domanda mi sono subito trovato la risposta, dopo un paio di ricerche su Google

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

A quanto pare questo accade a causa della classe wrapper. Anche così, sembra che ogni proprietà passata debba essere aggiunta alla collezione ViewData per impostazione predefinita.

ho davvero bisogno di smettere di rispondere alle mie domande :(