Quale vantaggio speravi di ottenere utilizzando il tipo dinamico qui?
L'utilizzo del dizionario ViewData è un modo molto semplice di aggiungere oggetti/elementi arbitrari all'output della vista.
Non è necessario il riflesso per ottenere i nomi delle proprietà nella vista. Basta usare ViewData.Keys
per ottenere la raccolta di nomi.
Modifica: Ho appena imparato un po 'di più sulla dinamica e penso che forse è necessario creare la propria classe oggetto dinamica che eredita da DynamicObject. Avrai voglia di avere un dizionario privato in quella classe e quindi di sovrascrivere TrySetMember
e TryGetMember
.
Modifica a parte: Penso che un vantaggio di un ViewModel fortemente tipizzato è che è possibile accettarlo come parametro nei metodi di azione POST. Il framework MVC gestirà l'associazione del modello e nel metodo di azione è sufficiente un'istanza della classe ViewModel. Non penso che avrai un vantaggio con una dinamica anche se funzionano.
Modifica risultato: Bene, ho provato a utilizzare una classe derivata da DynamicObject, ma VS2010 si arresta in modo anomalo quando tenta di eseguire il rendering della vista. Non ottengo alcuna eccezione, solo un arresto anomalo e riavvio di Visual Studio. Ecco il codice che ho scoperto che causa l'arresto.
La classe dinamica personalizzato:
public class DynViewModel : DynamicObject
{
private Dictionary<string, object> ViewDataBag;
public DynViewModel()
{
this.ViewDataBag = new Dictionary<string, object>();
}
public override bool TrySetMember(SetMemberBinder binder, object value)
{
this.ViewDataBag[binder.Name] = value;
return true;
}
public override bool TryGetMember(GetMemberBinder binder, out object result)
{
result = this.ViewDataBag[binder.Name];
return true;
}
}
Nel controllore:
public ActionResult DynamicView()
{
dynamic p = new DynamicViewModel.Models.DynViewModel();
p.Name = "Test";
p.Phone = "111-2222";
return View(p);
}
mio punto di vista è fondamentalmente lo stesso di quello che è elencato nella questione:
<p>Name: <%=Model.Name %></p>
<p>Phone: <%=Model.Phone %></p>
mio Conclusione: Questo potrebbe funzionare, ma nella Beta 1 di VS2010 non posso capire perché il mio codice causa l'arresto anomalo di Visual Studio. Lo proverò di nuovo in VS2010 Beta 2 quando verrà rilasciato perché è un esercizio interessante per imparare le dinamiche. Tuttavia, anche se dovesse funzionare, non vedo alcun vantaggio sull'uso del dizionario ViewData.
Phil Haack in soccorso! Ecco un post sul blog di Phil Haack che potrebbe aiutarti. Sembra che sia quello che stavi cercando. Fun With Method Missing and C# 4
Puoi pubblicare altro codice? Mi piacerebbe soprattutto vedere il costruttore su View – Randolpho
Controllare il mio ultimo aggiornamento con un collegamento al post del blog di Phil Haack. – CoderDennis