est-ce possible? Voici ce que j'essaie: puis mon affichage hérite de Je reçois une erreur: '<> f__anonymouspetype1.name' est inaccessible en raison de son niveau de protection p> donc essentiellement, c'est ce que j'essaie de faire tout simplement pas possible? Pourquoi ou pourquoi pas? P> Mise à jour: voici mon point de vue p> Le constructeur de vue est intégré au cadre. P> p > System.web.mvc.viewpage
4 Réponses :
Les types anonymes ne peuvent pas être renvoyés par une méthode; Ils ne sont valables que dans le cadre de la méthode dans laquelle ils sont définis. p>
Vous devez utiliser une classe de modèle que vous avez déjà définie et transmettez-la à votre vue. Il n'y a rien de mal à passer une classe de modèle qui n'a pas de champ défini. P>
Je pense que j'avais tort auparavant. Cela devrait fonctionner. Le problème est peut-être dans la vue. Pouvez-vous poster plus de code? Surtout la vue et son constructeur. p>
OK, j'avais tort de passer un type anonyme à une autre méthode d'utilisation comme une variable dynamique - cela peut être fait. P>
Mais j'étais aussi tort dans ma conviction que ce que vous essayez de faire fonctionnerait. Malheureusement pour vous, ce ne sera pas. Le problème est que vous utilisez Que serait nécessaire, c'est un Cela dit, vous ne gagneriez rien. Vous seriez capable de spécifier vos points de vue comme vous l'avez fait (c'est-à-dire Cela a été intéressant (et, malheureusement pour moi, absorbant) l'expérience de pensée, mais je pense, finalement, que cela ne se produira pas. Soit déclarer un type public et transmettez-le à votre point de vue ou utilisez le dictionnaire non typé. p> ViewPage ViewDatadication dynamicviewpage CODE> classe et correspondant dynamicViewdictionner code> Classe qui accepte objet code> et stockez-le en interne comme dynamique. Ensuite, vous pouvez utiliser un type anonyme et transmettre à vos points de vue. p>
<% = Model.Name%> code>), mais vous ne bénéficierez pas d'une dactylographie forte. Il n'y aurait pas d'intellisense et il n'y aurait pas de sécurité de type. Vous feriez aussi aussi d'utiliser le Code> NonTyped ViewdAndictionner Code> comme @dennis Palmer suggère. p>
Mais je pouvais accéder aux membres de l'objet par la réflexion, c'est pourquoi je pensais que la typing dynamique pourrait fonctionner.
Hmm ... et votre erreur suggère qu'il se produit à votre avis, ce qui signifie que le passage du type anonyme à la vue fonctionne, mais que le niveau de nom de protection par défaut est protégé ou privé. Et vous ne pouvez pas spécifier le niveau de protection d'un type anonyme lorsque vous le déclarez.
Maintenant que cela a été accepté pouvez-vous modifier uniquement la dernière mise à jour?
@ C.Ross: Je ne suis pas sûr de comprendre la question.
quel avantage espériez-vous obtenir d'utiliser le type dynamique ici?
Utilisation du dictionnaire ViewData est un moyen très facile d'ajouter des objets arbitraires / des éléments à votre sortie de vue. P>
You Don ' t besoin de réflexion pour obtenir les noms de propriété à votre avis. Il suffit d'utiliser EDIT: STRUT> Je viens d'apprendre un peu plus sur la dynamique moi-même et je pense que Vous devez créer votre propre classe d'objet dynamique qui hérite d' DynamicObject . Vous voudrez avoir un dictionnaire privé dans cette classe, puis remplacer modifier: strong> Je pense que l'un des avantages d'une vue de vue fortement dactylographiée est que vous pouvez l'accepter comme paramètre dans vos méthodes d'action post-action. Le framework MVC gérera la liaison de modèle et dans la méthode d'action que vous avez simplement une instance de votre classe de viewModel. Je ne pense pas que vous aurez l'avantage avec une dynamique, même si elles fonctionnent. P> Modifier le résultat: strong> Eh bien, j'ai essayé d'utiliser une classe dérivée de dynamicObject, mais vs2010 se bloque quand il essaie de rendre la vue. Je ne reçois aucune exception, juste un crash dur et un studio visuel redémarre. Voici le code que j'ai proposé qui provoque l'accident. P> La classe dynamique personnalisée: p> dans le contrôleur: p> visionnementdata.keys code> pour obtenir la collection de noms. P> trysetmember code> et trygetMember code>. P> <p>Name: <%=Model.Name %></p>
<p>Phone: <%=Model.Phone %></p>
Eh bien, je ne suis pas vraiment sûr à 100%, je vais juste expérimenter un peu avec 4,0. Je suppose que ce que j'aimerais voir, c'est la possibilité d'utiliser le modèle de menuelle de vue sans avoir à écrire explicitement un tas de mots de vue, mais j'essaie également d'obtenir une compréhension plus profonde de la typage dynamique de C #.
L'erreur réelle ici ( La solution consiste à transmettre de classes concrètes / nommées comme des modèles à votre vue. La vue elle-même peut toujours utiliser <> f__anonymouspetype1.name 'est inaccessible en raison de son niveau de protection code>) résulte de l'utilisation de types anonymes. Les types anonymes sont implicitement interne code> (au moins en C #), ils ne peuvent donc être consultés que normalement du même assemblage. Étant donné que votre vue est compilée dans un assembly distinct em> au moment de l'exécution, il ne peut pas accéder au type anonyme code> anonyme interne p>
dynamique code> si vous le souhaitez. P>
sur .NET 4.0 Les types anonymes peuvent facilement être convertis en expresoObjects et donc tous les problèmes sont fixés avec les frais généraux de la conversion elle-même. Vérifiez ici P>
Pouvez-vous publier plus de votre code? Je voudrais surtout de voir le constructeur pour voir
Découvrez ma dernière mise à jour avec un lien vers le blog de Phil Haack's Blog.