12
votes

Vue dynamique TypedPage

est-ce possible? Voici ce que j'essaie: xxx

puis mon affichage hérite de System.web.mvc.viewpage et essaie d'imprimer le modèle.name.

Je reçois une erreur: '<> f__anonymouspetype1.name' est inaccessible en raison de son niveau de protection

donc essentiellement, c'est ce que j'essaie de faire tout simplement pas possible? Pourquoi ou pourquoi pas?

Mise à jour: voici mon point de vue xxx

Le constructeur de vue est intégré au cadre.


2 commentaires

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.


4 Réponses :


7
votes

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.

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.

mise à jour :

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.

Mettez à jour le second:

OK, j'avais tort de passer un type anonyme à une autre méthode d'utilisation comme une variable dynamique - cela peut être fait.

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 ViewPage , qui utilise un ViewDatadication en interne. Parce qu'ils nécessitent des types puissants, vous ne pourrez pas utiliser des objets dynamiques avec eux. La structure interne n'utilise tout simplement pas dynamique en interne et spécifiant dynamique que le type échoue.

Que serait nécessaire, c'est un dynamicviewpage classe et correspondant dynamicViewdictionner Classe qui accepte objet et stockez-le en interne comme dynamique. Ensuite, vous pouvez utiliser un type anonyme et transmettre à vos points de vue.

Cela dit, vous ne gagneriez rien. Vous seriez capable de spécifier vos points de vue comme vous l'avez fait (c'est-à-dire <% = Model.Name%> ), 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 NonTyped ViewdAndictionner comme @dennis Palmer suggère.

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é.


4 commentaires

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.



7
votes

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 visionnementdata.keys code> pour obtenir la collection de noms. P>

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 trysetmember code> et trygetMember code>. P>

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> xxx pré>

dans le contrôleur: p>

<p>Name: <%=Model.Name %></p>
<p>Phone: <%=Model.Phone %></p>


1 commentaires

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 #.



1
votes

L'erreur réelle ici ( <> f__anonymouspetype1.name 'est inaccessible en raison de son niveau de protection ) résulte de l'utilisation de types anonymes. Les types anonymes sont implicitement interne (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 au moment de l'exécution, il ne peut pas accéder au type anonyme anonyme interne

La solution consiste à transmettre de classes concrètes / nommées comme des modèles à votre vue. La vue elle-même peut toujours utiliser dynamique si vous le souhaitez.


0 commentaires

1
votes

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


0 commentaires