Utilisation de MVC 3 avec le moteur de visualisation Razor. J'ai cette vue:
@model dynamic
@{
var products = (List<ListItemBaseModel>)Model.Products;
var threshold = (int)(Model.Threshold ?? 1);
var id = Guid.NewGuid().ToString();
}
Il est appelé depuis une autre vue en utilisant ce code:
@Html.Partial("PartialViewName", new { Products = Model, Threshold = 5 })
Dans les deux vues, lorsque je les débogue et regarde Model, il semble contenir le bon objet. Lorsque j'exécute le code, j'obtiens une erreur sur la ligne "var products =" disant:
«objet» ne contient pas de définition pour «produits»
Quelqu'un peut-il m'expliquer pourquoi j'obtiens cette erreur? Encore une fois, lorsque je regarde l'objet Model en mode débogage, il semble correct (ayant 2 propriétés: Produits et Seuil)
asp.net-mvc-3
razor
Ruud van Falier
la source
la source
Réponses:
Passez-vous une instance d'une classe anonyme comme modèle de vue? Je viens d'essayer ceci (modèle de vue dynamique en CSHTML) et j'ai eu la même erreur que le vôtre lors de l'utilisation d'une classe anonyme, mais cela fonctionnait bien si je créais une classe nommée. J'ai cherché mais je n'ai vu cela documenté nulle part.
EDIT # 1:
Selon David Ebbo , vous ne pouvez pas passer un type anonyme dans une vue typée dynamiquement car les types anonymes sont compilés comme
internal
. La vue CSHTML étant compilée dans un assembly séparé, elle ne peut pas accéder aux propriétés du type anonyme.EDIT # 2:
David Ebbo a édité son message avec cette clarification:
la source
return View(new { Foo = 1, Bar = "test" });
? Parce que j'utilise MVC 4 et que j'obtiens toujours "l'objet ne contient pas de définition pour Foo"ToExpando
un)Sur .NET 4.0, les types anonymes peuvent facilement être convertis en ExpandoObjects et ainsi tous les problèmes sont résolus avec la surcharge de la conversion elle-même. Découvrez ici
la source
Cela n'a rien à voir avec les types anonymes ayant des propriétés internes
Il est parfaitement possible de passer des types anonymes d'une vue à une vue partielle
J'ai rencontré le même problème aujourd'hui et cela n'avait rien (directement) à voir avec le problème du passage des types anonymes et de leurs
internal
propriétés inhérentes .En tant que tel, en ce qui concerne la question des OP, la réponse de @Lucas n'est pas pertinente - même si la solution de contournement fonctionnera .
Dans la question OP, un type anonyme est passé d'une vue dans l'assembly X à une vue partielle dans l'assembly X , par conséquent le problème que David Ebbo a souligné concernant les propriétés internes pour les types anonymes est sans conséquence; les types compilés pour la vue, le type partiel et le type anonyme sont tous contenus dans le même assembly .
Alors, qu'est-ce qui cause l'échec soudain de passer un type anonyme d'une vue à un partiel?
Au moins dans ma situation, j'ai découvert que c'était dû à une autre vue dans le même dossier qui spécifie un type de modèle qui ne peut pas être résolu . Les vues sont compilées au moment de l'exécution, et il serait donc logique qu'un échec lors de l'exécution de la compilation des vues signifierait également un échec de compilation des types dynamiques et que le partiel recevrait simplement un fichier
object
. Ce qui se passe n'est pas immédiatement évident, mais dans l'exemple spécifique des OP (et le mien), c'est plus que probablement la cause du problème.Il est intéressant de noter que si le type de modèle est correct mais qu'une autre partie de la vue ne se compile pas, les types anonymes ne sont pas affectés de la même manière. Cela doit être dû à la façon dont Razor rompt la compilation dynamique des composants de la vue.
Une fois que vous avez corrigé la vue incriminée, reconstruisez toute la solution ou nettoyez et reconstruisez le projet avant de vérifier si elle est corrigée.
Pour vous assurer de ne pas être à nouveau pris au piège, vous pouvez activer la compilation au moment de la compilation de vos vues Razor en ajoutant ceci à votre
csproj
fichier:la source
Ajoutez la classe suivante n'importe où dans votre solution (utilisez l'espace de noms System, donc c'est prêt à être utilisé sans avoir à ajouter de références) -
Lorsque vous envoyez le modèle à la vue, convertissez-le en Expando:
la source
Au lieu d'utiliser le
dynamic
type de modèle dans la vue partielle.Vous pouvez appeler les attributs d'objets anonymes en utilisant
@ViewData.Eval("foo")
au lieu de@Model.foo
.Ensuite, vous pouvez supprimer
@Model dynamic
de la vue.Je suis tombé sur ce problème récemment en passant certains attributs entre les vues pour l'intégration des commentaires sociaux Facebook. Exemple de code:
Ensuite, à mon avis, je viens d'avoir cette div:
la source
Je ne suis pas sûr que vous obteniez cette erreur car vous n'implémentez pas la solution de contournement. J'ai eu la même erreur dans une vue partielle. la solution consistait simplement à nettoyer la version et à la reconstruire. si la syntaxe est correcte, le code devrait fonctionner, mais le moteur de rasoir peut ne pas mettre à jour correctement les modifications de code.
la source
J'ai contourné ce problème en utilisant un dictionnaire.
la source
Pour utiliser le
dynamic
type, vous devez référencer l'Microsoft.CSharp
assemblyla source