MVC Razor modello dinamico, ‘object’ non contiene la definizione di ‘PropertyName’

Utilizzo di MVC 3 con il motore di visualizzazione Razor. Ho questa vista:

@model dynamic @{ var products = (List)Model.Products; var threshold = (int)(Model.Threshold ?? 1); var id = Guid.NewGuid().ToString(); } 

Viene chiamato da un’altra vista usando questo codice:

 @Html.Partial("PartialViewName", new { Products = Model, Threshold = 5 }) 

In entrambe le viste, quando eseguo il debug e guardo Model, sembra che contenga l’object corretto. Quando eseguo il codice ottengo un errore sulla riga “var products =” dicendo:

‘object’ non contiene una definizione per ‘Prodotti’

Qualcuno può spiegarmi perché ho ricevuto quell’errore? Di nuovo, quando guardo l’object Model in modalità debug sembra tutto a posto (avendo 2 proprietà: Prodotti e Soglia)

Stai passando un’istanza di una class anonima come modello di visualizzazione? Ho appena provato questo (modello di visualizzazione dynamic in CSHTML) e ho ottenuto lo stesso errore di quando si utilizzava una class anonima, ma ha funzionato correttamente se avessi creato una class con nome. Ho cercato ma non ho visto questo documentato da nessuna parte.

 // error return View(new { Foo = 1, Bar = "test" }); // worked return View(new TestClass { Foo = 1, Bar = "test" }); 

MODIFICA # 1:

Secondo David Ebbo , non è ansible passare un tipo anonimo a una vista con caratteri dinamici perché i tipi anonimi sono compilati come internal . Poiché la vista CSHTML è compilata in un assembly separato, non può accedere alle proprietà del tipo anonimo.

MODIFICA # 2:

David Ebbo ha modificato il suo post con questo chiarimento:

Nota (22/12/2011): ora che MVC 3 supporta direttamente la dynamic, la tecnica seguente non è più necessaria. Questo post è in effetti ciò che ha portato all’integrazione della funzionalità in MVC!

Su .NET 4.0 i tipi anonimi possono essere facilmente convertiti in ExpandoObjects e quindi tutti i problemi vengono risolti con il sovraccarico della conversione stessa. Dai un’occhiata qui

Questo non ha nulla a che fare con i tipi anonimi che hanno proprietà interne

È perfettamente ansible passare tipi anonimi da una vista a una vista parziale

Ho incontrato lo stesso problema oggi e non era niente (direttamente) a che fare con il problema del passaggio di tipi anonimi e delle loro proprietà internal intrinseche.

In quanto tale, in relazione alla domanda sui PO, la risposta di @ Lucas è irrilevante, anche se la soluzione funzionerà .

Nella domanda OP, un tipo anonimo viene passato da una vista nell’assembly X ad un partial nell’assembly X , quindi il problema che David Ebbo ha delineato delle proprietà interne per i tipi anonimi non ha alcuna conseguenza; i tipi compilati per la vista, il tipo parziale e anonimo sono tutti contenuti nello stesso assembly .

Quindi cosa sta causando l’improvvisa incapacità di passare un tipo anonimo da una vista ad una parziale?

Almeno nella mia situazione, ho scoperto che era dovuto ad avere un’altra vista nello SAME FOLDER che specifica un tipo di modello che non può essere risolto . Le viste vengono compilate in fase di runtime e quindi avrebbe senso poiché un errore in fase di runtime per compilare le viste significherebbe anche un errore nella compilazione dei tipi dinamici e il parziale riceverebbe semplicemente un object . Non è immediatamente evidente ciò che sta succedendo, ma nell’esempio specifico OP (e mio) questo è più che probabile la causa del problema.

È interessante notare che se il tipo di modello è corretto ma un’altra parte della vista non viene compilata, i tipi anonimi non vengono influenzati allo stesso modo. Questo deve essere dovuto al modo in cui Razor interrompe la compilazione dynamic delle parti componenti della vista.

Dopo aver corretto la vista incriminata, ribuild l’intera soluzione o pulire e ribuild il progetto prima di verificare se è stato corretto.

Per assicurarti di non essere di nuovo scoperto da questo, puoi abilitare la compilazione del tempo di compilazione delle tue visualizzazioni Razor aggiungendo questo al tuo file csproj :

  true  

Aggiungi la seguente class in qualsiasi punto della tua soluzione (usa System namespace, quindi è pronta per l’uso senza dover aggiungere alcun riferimento) –

  namespace System { public static class ExpandoHelper { public static ExpandoObject ToExpando(this object anonymousObject) { IDictionary anonymousDictionary = HtmlHelper.AnonymousObjectToHtmlAttributes(anonymousObject); IDictionary expando = new ExpandoObject(); foreach (var item in anonymousDictionary) expando.Add(item); return (ExpandoObject)expando; } } } 

Quando si invia il modello alla vista, convertirlo in Expando:

  return View(new {x=4, y=6}.ToExpando()); 

Invece di utilizzare il tipo di modello dynamic nella vista parziale.

Puoi chiamare gli attributi dell’object anonimo usando @ViewData.Eval("foo") invece di @Model.foo .

Quindi puoi rimuovere @Model dynamic dalla vista.

Mi sono imbattuto recentemente in questo problema quando ho passato alcuni attributi tra le visualizzazioni per l’integrazione dei commenti sociali di Facebook. Codice di esempio:

 Html.RenderPartial(@"Layouts/Partials/_Comments", new {currentUrl = Model.CurrentPage.GetAbsoluteUrl(), commentCount = 5 }); 

Quindi a mio avviso ho appena avuto questo div:

 

non sono sicuro che tu stia ricevendo questo errore perché non stai implementando il work-around. ho lo stesso errore in una vista parziale. la soluzione era solo per pulire la build e ricostruirla. se la syntax è corretta, il codice dovrebbe funzionare, ma il motore del razor potrebbe non aggiornare correttamente le modifiche al codice.

Per utilizzare dynamic tipo dynamic è necessario fare riferimento all’assembly Microsoft.CSharp