Controllo utente Asp.net MVC ViewData
-
09-06-2019 - |
Domanda
Quando un controller esegue il rendering di una vista basata su un modello, puoi ottenere le proprietà dalla raccolta ViewData utilizzando l'indicizzatore (ad es.VisualizzaDati["Proprietà"]).Tuttavia, ho un controllo utente condiviso che ho provato a chiamare utilizzando quanto segue:
return View("Message", new { DisplayMessage = "This is a test" });
e sul mio controllo Messaggi avevo questo:
<%= ViewData["DisplayMessage"] %>
Penserei che ciò renderebbe correttamente DisplayMessage, tuttavia, viene restituito null.Dopo una forte dose di tentativi, ho finalmente creato una classe "MessageData" per digitare in modo forte 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 in questo modo:
<%= ViewData.Model.DisplayMessage %>
Perché la proprietà DisplayMessage non dovrebbe essere aggiunta a ViewData (ad es.raccolta ViewData["DisplayMessage"]) senza digitare in modo sicuro il controllo utente?È questo in base alla progettazione?Non avrebbe senso che ViewData contenesse una chiave per "DisplayMessage"?
Soluzione
Il metodo
ViewData.Eval("DisplayMessage")
dovrebbe funzionare per te.
Altri suggerimenti
Ovviamente dopo aver creato questa domanda trovo immediatamente la risposta dopo qualche altra ricerca su Google
http://forums.asp.net/t/1197059.aspx
Apparentemente ciò accade a causa della classe wrapper.Anche così, sembra che qualsiasi proprietà passata debba essere aggiunta alla raccolta ViewData per impostazione predefinita.
Devo davvero smettere di rispondere alle mie stesse domande :(