RuntimeBinderException lors de l'accès dynamique de type anonyme en vue
J'ai rencontré une étrange anomalie lors de l'apprentissage/bricolage avec asp.net.
J'essaie de montrer une vue partielle comme ceci:
@Html.Partial("_PartialView", new { Action = "Foo" })
Lorsque j'essaye d'accéder à de l'Action avec
//Throws Microsoft.Csharp.RuntimeBinder.RuntimeBinderException
string throwsException = Model.Action;
un RuntimeBinderExceptionis avec le message
'objet' ne contient pas une définition pour 'Action'
est levée.
La chose étrange est que cette ligne fonctionne très bien:
//This line works fine
string works = ((Type)Model.GetType()).GetProperty("Action").GetValue(Model);
Ce comportement me énigmes un peu et je préfère éviter d'utiliser cette solution de contournement. Aussi je ne pense pas que le problème est les types anonymes être à l'intérieur parce que le modèle MVC pour ASP.NET Projet de VS2013 fonctionne bien:
Donc ce qui s'est passé ici?
Ce qui m'est arrivé; il travaille et puis il s'est juste arrêté, pour aucune bonne raison. Je ne peux pas comprendre pourquoi. Comme évoqué dans un autre commentaire: faiblement typé vues avec les types anonymes travailler dans d'autres lieux, tels que les modèles Visual Studio. La question est de savoir ce qui les rend soudainement cesser de travailler ici.
OriginalL'auteur Kabbalah | 2013-11-12
Vous devez vous connecter pour publier un commentaire.
Votre vue partielle est faiblement typé. Vous n'avez pas de
@model
de définition. Donc, par défaut il estobject
qui, évidemment, n'a pas deAction
propriété.La bonne façon de résoudre ce problème est de définir un modèle d'affichage:
que votre vue partielle sera fortement typé:
et qui sera adoptée par la vue principale:
Une autre possibilité (qui, personnellement, je n'aime pas car elle repose sur la liaison de runtime) est d'utiliser un modèle dynamique dans la vue partielle:
et alors vous serez en mesure de passer un objet anonyme lors de l'appel:
Lors de l'utilisation d'une machine virtuelle évite ou résout le problème, il ne permet pas d'expliquer l'erreur. Le cas par défaut accepte normalement dynamique/objets anonymes (pas d'Objet). Les types anonymes dans les vues partielles, mais sous certains (encore inconnu circonstance), il s'arrête tout simplement de travail. Je viens de frapper ce même problème et ont dû changer d'utiliser des objets fortement typés. Comme la Kabbale dit,
@model dynamic
échoue de la même façon que l'original (comme c'est déjà attend à une dynamique).Vous pouvez également utiliser la réflexion, mais que ce serait une mauvaise chose à faire. Vous pouvez ajouter une extension de la méthode sur l'Objet avec T GetData<T>(ce modèle d'objet,de clés de la Chaîne)... modèle de rendement.GetType().GetProperty(clé).GetValue(modèle) T. statique méthode utilitaire, il serait mieux. Soyons honnête, le gain de performance n'est pas mauvais. Helper.Données<T>(Modèle, la clé).
OriginalL'auteur Darin Dimitrov
La réponse à cette question peut être trouvée ici: http://www.heartysoft.com/ashic/blog/2010/5/anonymous-types-c-sharp-4-dynamic
Tirant à partir de l'excellent blog post:
Anonymous Types are Internal
La raison de l'appel à
Model.Action
échoue, c'est que les informations de type deModel
n'est pas disponible au moment de l'exécution. La raison pour laquelle il n'est pas disponibles parce que les types anonymes ne sont pas publiques. Lorsque la méthode retourne une instance de ce type anonyme, c'est le retour d'un Système.Objet qui fait référence à une instance d'un type anonyme - un type qui a de l'info n'est pas disponible pour le programme principal. La dynamique d'exécution tente de trouver une propriété appeléeAction
sur l'objet, mais ne peut pas se résoudre à partir de la nature de l'information dont il dispose. En tant que tel, il lève une exception.Pas plus qu'il ne peut pas
OriginalL'auteur Paul
Voici quelques options à l'aide de la réflexion. La performance devrait être négligeable dans la plupart des scénarios.
Classe Utilitaire
vue.cshtml
paritial.cshtml fichier
Avec un plus compact parital appel en vue.cshtml
Avec des variables ajustées de manière à obtenir déduit noms dans paritial.cshtml fichier
Il n'est pas difficile de créer une simple vue-modèle de la classe mais je n'aime pas les classes qui ne seront utilisés qu'une seule fois pour la transmission des données, de sorte que cela fonctionne pour moi.
Vous pouvez également étendre la vue par défaut de la base de
Registre de la classe de base dans l' /Vues/web.config
Obtenir les données dans votre vue partielle, comme ce
Ou à l'aide d'une méthode d'extension qui j'ai proposé contre.
Cette option n'est pas vraiment acheter quelque chose depuis que nous sommes de trouver le modèle à partir de l'intérieur de la précédente méthode utilitaire. L'appel allait devenir.
OriginalL'auteur jwize