2012-01-11 11 views
6

Eventuali duplicati:
Dynamic Anonymous type in Razor causes RuntimeBinderExceptiontipo dinamico nella visualizzazione MVC

Sto cercando di utilizzare un modello di tipo dinamico nella mia applicazione MVC. Ho il seguente codice: controller:

var model = new { Name = "test name", Family = "m" }; 
return this.View(model); 

e nella vista ho:

@model dynamic 

@if(Model!=null) 
{ 
    <p> @Html.Raw(Model.Name) </p> 
} 

Quando sto facendo funzionare questo, sto ottenendo il seguente errore:

'object' does not contain a definition for 'Name' (System.Exception {Microsoft.CSharp.RuntimeBinder.RuntimeBinderException) 

Perché ottengo questo errore? Durante il debug, se metto il cursore su @Model, posso vedere che ha due proprietà denominate Nome e Famiglia.

+0

potete vedere '@ proprietà model' durante il debug a causa della riflessione ... –

+0

Grazie, quindi perché sto ricevendo l'errore? L'oggetto ha quella proprietà ed è di tipo dinamico! – mans

risposta

16

Quello che hai mostrato non è un tipo dinamico. È un tipo anonimo. C'è un'enorme differenza.

Non è possibile utilizzare tipi anonimi come modelli. Il motivo è dovuto al fatto che il compilatore emette tipi anonimi come interno. Ciò significa che sono accessibili solo con l'attuale assemblaggio. Ma come sapete, le visualizzazioni di Razor sono compilate dal runtime di ASP.NET come assembly separati che non hanno modo di utilizzare quei tipi anonimi.

Ovviamente il modo corretto in questo caso è quello di utilizzare un modello di vista:

public class MyViewModel 
{ 
    public string Name { get; set; } 
    public string Family { get; set; } 
} 

e poi l'azione controllore passare questo modello prospettiva della vista:

var model = new MyViewModel { Name = "test name", Family = "m" }; 
return this.View(model); 

modo che l'immagine può funzionare con esso:

@model MyViewModel 
@if (Model != null) 
{ 
    <p>@Model.Name</p> 
} 

Alcune persone (non io, io consiglierei mai nulla di simile) inoltre utilizzare ViewBag e in questo modo non hanno bisogno di un modello:

ViewBag.Name = "test name"; 
ViewBag.Family = "m"; 
return this.View(); 

e quindi nella vista:

<p>@ViewBag.Name</p> 
+0

Grazie per la spiegazione. Mi chiedo come viene implementato ViewBag? Posso avere un modello dinamico? questo post dice che è possibile: http://blogs.msdn.com/b/rickandy/archive/2011/01/28/dynamic-v-strongly-typed-views.aspx ma non potevo farlo. – mans

+0

@ user654019, ViewBag è solo un wrapper dinamico attorno al dizionario ViewData. È necessario disporre di un tipo concreto da utilizzare come modello. Si potrebbe usare '@model dnyamic' ma se questo modello non punta a un tipo specifico (non oggetto anonimo, non può funzionare con oggetti anonimi per i motivi che ho descritto nella mia risposta) semplicemente non funzionerà. Nel post del blog che hai collegato indicano il modello dnyamic a classi concrete definite come "Blog", "Elenco ", tutte fortemente digitate. Non c'è un singolo oggetto anonimo. Puoi dimenticarti di loro in ASP.NET MVC. –

+0

Grazie, puoi darmi qualche indizio su come Viewbag è implementato? Qualsiasi documento? – mans

Problemi correlati