107 votes

Modèle dynamique MVC Razor, 'object' ne contient pas de définition pour 'PropertyName'

En utilisant MVC 3 avec le moteur de vue Razor. J'ai ce point de Vue:

@model dynamic
@{
    var products = (List<ListItemBaseModel>)Model.Products;
    var threshold = (int)(Model.Threshold ?? 1);
    var id = Guid.NewGuid().ToString();
}

Il est appelé à partir d'un autre point de vue à l'aide de ce code:

@Html.Partial("PartialViewName", new { Products = Model, Threshold = 5 })

Dans les deux Vues, quand je debug et Modèle de montre, il semble contenir l'objet correct. Lorsque j'exécute le code, j'obtiens une erreur sur le "var produits =" line disant:

l '"objet" ne contient pas une définition pour 'Produits'

Quelqu'un peut-il m'expliquer pourquoi je reçois cette erreur? Encore une fois, quand je regarde le Modèle d'objet en mode de débogage, il semble tout droit (2 propriétés: Produits et Seuil)

153voto

Lucas Points 10415

Êtes-vous en passant une instance de la classe anonyme comme le modèle de vue? J'ai juste essayé cette dynamique (modèle de vue en CSHTML) et a obtenu la même erreur que votre lors de l'utilisation d'une classe anonyme, mais il a bien fonctionné si j'ai créé une classe nommée. J'ai cherché mais n'ai pas vu ce document n'importe où.

// error
return View(new { Foo = 1, Bar = "test" });

// worked
return View(new TestClass { Foo = 1, Bar = "test" });

EDIT:

Selon David Ebbon, vous ne pouvez pas passer d'un type anonyme en dynamique, de type de vue, car les types anonymes sont compilés à l' internal. Depuis le CSHTML vue est compilé dans une autre assemblée, il ne peut pas accéder à l'anonyme du type de propriétés.

41voto

DotNetWise Points 2237

Sur .NET 4.0, les types anonymes peuvent facilement être convertis en ExpandoObjects et tous les problèmes sont résolus avec la surcharge de la conversion elle-même. Découvrez ici

27voto

joshcomley Points 9308

Cela n'a rien à voir avec les types anonymes ayant des propriétés internes

Il est parfaitement possible de passer anonyme types à partir d'une vue de la une vue partielle

J'ai rencontré le même problème aujourd'hui et ce n'était rien (directement) à voir avec le problème du passage des types anonymes et de leur inhérente internal propriétés.

En tant que tel, en ce qui concerne la Fpo question, la réponse par @Lucas est sans importance - même si la solution de contournement va travailler.

Dans la Fpo question, un anonyme, un type est passé à partir d'une vue de l'assemblée des X à un partiel dans l'assemblage de X, donc le problème que David Ebon décrit des propriétés internes pour les types anonymes est sans conséquence; les types compilé pour la vue, le partiel et le type anonyme sont tous contenus dans la même assemblée.

Donc ce qui est à l'origine de la défaillance soudaine de passer d'un type anonyme d'une vue partielle?

Au moins dans ma situation, j'ai découvert que c'était en raison d'avoir un autre point de vue dans le MÊME DOSSIER que spécifie un type de modèle ne peut pas être résolu. Vues compilé au moment de l'exécution, et donc il serait logique qu'un échec à l'exécution de compiler les points de vue signifierait également un échec pour compiler la dynamique des genres et l'partielle serait tout simplement de recevoir un object. Il n'est pas immédiatement évident que ce qui se passe, mais dans la Fpo exemple précis (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 une autre partie de la vue ne se compile pas, puis les types anonymes ne sont pas touchés de la même façon. Ce doit être vers le bas pour combien de Rasoir casse la dynamique de l'élaboration des composantes de la vue.

Une fois que vous corriger la délinquance, de reconstruire l'ensemble de la solution ou de nettoyer et reconstruire le projet avant de vérifier pour voir si c'est corrigé.

Pour vous assurer de ne pas être surpris par ce nouveau, vous pouvez activer la compilation la compilation de votre Rasoir vues en ajoutant ceci à votre csproj le fichier:

<PropertyGroup>
    <MvcBuildViews>true</MvcBuildViews>
</PropertyGroup>

9voto

Ajoutez la classe suivante n'importe où dans votre solution (utilisez l'espace de noms système, de sorte qu'il soit prêt à l'emploi sans avoir à ajouter de références) -

     namespace System
    {
        public static class ExpandoHelper
        {
            public static ExpandoObject ToExpando(this object anonymousObject)
            {
                IDictionary<string, object> anonymousDictionary = HtmlHelper.AnonymousObjectToHtmlAttributes(anonymousObject);
                IDictionary<string, object> expando = new ExpandoObject();
                foreach (var item in anonymousDictionary)
                    expando.Add(item);
                return (ExpandoObject)expando;
            }

        }
    }
 

Lorsque vous envoyez le modèle à la vue, convertissez-le en Expando:

     return View(new {x=4, y=6}.ToExpando());
 

0voto

goran Points 1

Je ne suis pas certain que vous obtenez cette erreur car vous n’implémentez pas cette solution. J'ai eu la même erreur dans une vue partielle. la solution consistait simplement à nettoyer la construction et à la reconstruire. Si la syntaxe est correcte, le code devrait fonctionner, mais le moteur de rasoir ne met peut-être pas à jour correctement les modifications de code.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X