J'obtiens l'erreur suivante:
'objet' ne contient pas de définition pour 'RatingName'
Lorsque vous regardez le type dynamique anonyme, il a clairement RatingName.
Je réalise que je peux le faire avec un Tuple, mais j'aimerais comprendre pourquoi le message d'erreur se produit.
dynamic
asp.net-mvc-3
razor
anonymous-types
JarrettV
la source
la source
J'ai trouvé la réponse dans une question connexe . La réponse est spécifiée sur le billet de blog de David Ebbo Passer des objets anonymes aux vues MVC et y accéder en utilisant des
la source
L' utilisation de la méthode ToExpando est la meilleure solution.
Voici la version qui ne nécessite pas l' assemblage System.Web :
la source
Au lieu de créer un modèle à partir d'un type anonyme, puis d'essayer de convertir l'objet anonyme en un objet
ExpandoObject
similaire ...Vous pouvez simplement créer
ExpandoObject
directement:Ensuite, dans votre vue, vous définissez le type de modèle comme dynamique
@model dynamic
et vous pouvez accéder directement aux propriétés:Je recommande normalement des modèles de vue fortement typés pour la plupart des vues, mais cette flexibilité est parfois pratique.
la source
Vous pouvez utiliser l' interface impromptue du framework pour envelopper un type anonyme dans une interface.
Vous venez de retourner un
IEnumerable<IMadeUpInterface>
et à la fin de votre utilisation Linq,.AllActLike<IMadeUpInterface>();
cela fonctionne car il appelle la propriété anonyme en utilisant le DLR avec un contexte de l'assembly qui a déclaré le type anonyme.la source
A écrit une application console et ajoutez Mono.Cecil comme référence (vous pouvez maintenant l'ajouter à partir de NuGet ), puis écrivez le morceau de code:
Le code ci-dessus obtiendrait le fichier d'assembly à partir des arguments d'entrée et utiliserait Mono.Cecil pour modifier l'accessibilité de interne à public, ce qui résoudrait le problème.
Nous pouvons exécuter le programme dans l'événement Post Build du site Web. J'ai écrit un article de blog à ce sujet en chinois, mais je pense que vous pouvez simplement lire le code et les instantanés. :)
la source
Sur la base de la réponse acceptée, j'ai remplacé le contrôleur pour le faire fonctionner en général et dans les coulisses.
Voici le code:
Maintenant, vous pouvez simplement passer un objet anonyme comme modèle, et cela fonctionnera comme prévu.
la source
Je vais faire un peu de vol sur https://stackoverflow.com/a/7478600/37055
Si vous installez dynamitey, vous pouvez faire ceci:
Et les paysans se réjouissent.
la source
La raison de RuntimeBinderException déclenchée, je pense qu'il y a une bonne réponse dans d'autres articles. Je me concentre simplement pour expliquer comment je le fais fonctionner.
En vous référant à la réponse @DotNetWise et vues de liaison avec collection de types anonyme dans ASP.NET MVC ,
Tout d'abord, créez une classe statique pour l'extension
Dans le contrôleur
Dans View, @model IEnumerable (dynamique, pas une classe de modèle), c'est très important car nous allons lier l'objet de type anonyme.
Le type dans foreach, je n'ai aucune erreur en utilisant var ou dynamic .
En passant, créer un nouveau ViewModel qui correspond aux nouveaux champs peut également être le moyen de transmettre le résultat à la vue.
la source
Maintenant en saveur récursive
la source
L'utilisation de l'extension ExpandoObject fonctionne mais s'arrête lors de l'utilisation d'objets anonymes imbriqués.
Tel que
Pour ce faire, j'utilise ceci.
L'utilisation dans le contrôleur est la même sauf que vous utilisez ToRazorDynamic () au lieu de ToExpando ().
À votre avis, pour obtenir l'intégralité de l'objet anonyme, ajoutez simplement ".AnonValue" à la fin.
la source
J'ai essayé ExpandoObject mais cela ne fonctionnait pas avec un type complexe anonyme imbriqué comme celui-ci:
Ma solution était donc de renvoyer un modèle JObject to View:
et convertir en dynamique en .cshtml:
la source