Ich erhalte die folgende Fehlermeldung:
'Objekt' enthält keine Definition für 'RatingName'
Wenn Sie sich den anonymen dynamischen Typ ansehen, hat er eindeutig RatingName.
Mir ist klar, dass ich dies mit einem Tupel tun kann, aber ich möchte verstehen, warum die Fehlermeldung auftritt.
dynamic
asp.net-mvc-3
razor
anonymous-types
JarrettV
quelle
quelle
Ich fand die Antwort in einer verwandten Frage . Die Antwort finden Sie in David Ebbos Blogbeitrag Übergeben anonymer Objekte an MVC-Ansichten und Zugriff auf diese mithilfe von Dynamic
quelle
Die Verwendung der ToExpando- Methode ist die beste Lösung.
Hier ist die Version, für die keine System.Web- Assembly erforderlich ist :
quelle
Anstatt ein Modell aus einem anonymen Typ zu erstellen und dann zu versuchen, das anonyme Objekt in ein solches zu konvertieren
ExpandoObject
...Sie können einfach die
ExpandoObject
direkt erstellen :Anschließend legen Sie in Ihrer Ansicht den Modelltyp als dynamisch fest
@model dynamic
und können direkt auf die Eigenschaften zugreifen:Normalerweise würde ich für die meisten Ansichten stark typisierte Ansichtsmodelle empfehlen, aber manchmal ist diese Flexibilität praktisch.
quelle
Sie können die Framework Impromptu-Schnittstelle verwenden , um einen anonymen Typ in eine Schnittstelle einzubinden.
Sie würden einfach eine zurückgeben
IEnumerable<IMadeUpInterface>
und am Ende Ihrer Linq-Verwendung.AllActLike<IMadeUpInterface>();
funktioniert dies, da die anonyme Eigenschaft über das DLR mit einem Kontext der Assembly aufgerufen wird, die den anonymen Typ deklariert hat.quelle
Schrieb eine Konsolenanwendung und fügte Mono.Cecil als Referenz hinzu (Sie können es jetzt über NuGet hinzufügen ). Schreiben Sie dann den Code:
Der obige Code würde die Assembly-Datei von den Eingabeargumenten abrufen und Mono.Cecil verwenden, um die Zugänglichkeit von intern zu öffentlich zu ändern. Dadurch würde das Problem behoben.
Wir können das Programm im Post Build-Event der Website ausführen. Ich habe einen Blog-Beitrag darüber auf Chinesisch geschrieben, aber ich glaube, Sie können einfach den Code und die Schnappschüsse lesen. :) :)
quelle
Basierend auf der akzeptierten Antwort habe ich den Controller überschrieben, damit er im Allgemeinen und hinter den Kulissen funktioniert.
Hier ist der Code:
Jetzt können Sie einfach ein anonymes Objekt als Modell übergeben, und es funktioniert wie erwartet.
quelle
Ich werde ein bisschen von https://stackoverflow.com/a/7478600/37055 stehlen
Wenn Sie das Paket dynamitey installieren , können Sie dies tun:
Und die Bauern freuen sich.
quelle
Der Grund für die ausgelöste RuntimeBinderException ist meiner Meinung nach in anderen Beiträgen gut zu beantworten. Ich konzentriere mich nur darauf zu erklären, wie ich es tatsächlich zum Laufen bringe.
Weitere Informationen finden Sie unter Beantworten von @ DotNetWise- und Bindungsansichten mit der Sammlung anonymer Typen in ASP.NET MVC .
Erstellen Sie zunächst eine statische Klasse für die Erweiterung
In der Steuerung
In View, @model IEnumerable (dynamisch, keine Modellklasse) ist dies sehr wichtig, da wir das anonyme Typobjekt binden werden.
Bei der Eingabe von foreach habe ich weder bei der Verwendung von var noch bei dynamic einen Fehler .
Wenn Sie ein neues ViewModel erstellen, das mit den neuen Feldern übereinstimmt, können Sie das Ergebnis auch an die Ansicht übergeben.
quelle
Jetzt im rekursiven Geschmack
quelle
Die Verwendung der ExpandoObject-Erweiterung funktioniert, funktioniert jedoch nicht, wenn verschachtelte anonyme Objekte verwendet werden.
Sowie
Um dies zu erreichen, benutze ich dies.
Die Verwendung im Controller ist dieselbe, außer dass Sie ToRazorDynamic () anstelle von ToExpando () verwenden.
Um das gesamte anonyme Objekt abzurufen, fügen Sie am Ende einfach ".AnonValue" hinzu.
quelle
Ich habe das ExpandoObject ausprobiert, aber es funktionierte nicht mit einem verschachtelten anonymen komplexen Typ wie dem folgenden:
Meine Lösung bestand also darin, ein JObject to View-Modell zurückzugeben:
und in .cshtml in dynamisch konvertieren:
quelle