66 votes

Rendu partiel de vue avec modèle dynamique dans le moteur de vue Razor et ASP.NET MVC 3

Lorsque j'essaie de rendre une vue partielle dont le modèle type est défini comme suit:

@model dynamic

en utilisant le code suivant:

@{Html.RenderPartial("PartialView", Model.UserProfile);}

J'obtiens l'exception suivante:

'System.Web.Mvc.HtmlHelper<dynamic>' has no applicable method named 'RenderPartial' but appears to have an extension method by that name. Extension methods cannot be dynamically dispatched. Consider casting the dynamic arguments or calling the extension method without the extension method syntax.

Cependant, le même code dans un .fichier aspx fonctionne parfaitement. Toutes les pensées?

55voto

Diego Points 1966

Viens de trouver la réponse, il semble que le point de vue où je me place de la RenderPartial code a un modèle dynamique, et donc, MVC ne pouvais pas choisir la bonne méthode à utiliser. Le Casting du modèle dans le RenderPartial appel vers le bon type fixe le problème.

source: http://stackoverflow.com/questions/3822546

26voto

jmfsg Points 18246

Au lieu de la coulée du modèle dans le RenderPartial appel, et puisque vous êtes à l'aide d'un rasoir, vous pouvez modifier la première ligne de votre point de vue de

@model dynamic

pour

@model YourNamespace.YourModelType

Cela a l'avantage de travailler sur chaque @Html.Partial appel que vous avez dans la vue, et vous donne également intellisense pour les propriétés.

18voto

Tom Points 3867

Peut aussi être appelé comme

@Html.Partial("_PartialView", (ModelClass)View.Data)

8voto

J Wynia Points 4679

Il y a une autre raison qui peut être jeté, même si vous n'êtes pas à l'aide de dynamic/ExpandoObject. Si vous faites une boucle, comme ceci:

@foreach (var folder in ViewBag.RootFolder.ChildFolders.ToList())
{
    @Html.Partial("ContentFolderTreeViewItems", folder)
}

Dans ce cas, le "var" à la place de la déclaration de type de va lancer la même erreur, malgré le fait que RootFolder est de type "Dossier. Par l'évolution de la var pour le type réel, le problème disparaît.

@foreach (ContentFolder folder in ViewBag.RootFolder.ChildFolders.ToList())
{
    @Html.Partial("ContentFolderTreeViewItems", folder)
}

4voto

Voici un moyen de passer un objet dynamique à une vue (ou vue partielle)

Ajoutez les éléments suivants de la classe n'importe où dans votre solution (utiliser l'espace de noms du Système, de sorte que son prêt à l'emploi sans avoir à ajouter toutes les 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 de la vue, de les convertir en Expando :

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

Cheers

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