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"?

È stato utile?

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 :(

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top