Rendre une vue partielle avec un modèle dynamique dans le moteur d'affichage Razor et ASP.NET MVC 3

StackOverflow https://stackoverflow.com/questions/4047543

Question

Lorsque j'essaie de restituer une vue partielle dont le type de modèle est spécifié comme :

@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.Des pensées?

Était-ce utile?

La solution

Juste trouvé la réponse, il semble que le point de vue où je plaçais le code RenderPartial avait un modèle dynamique, et donc, MVC ne pouvait pas choisir la bonne méthode à utiliser. La coulée du modèle dans l'appel RenderPartial au type correct résolu le problème.

source: aide Html.RenderPartial () dans les fichiers ascx

Autres conseils

Au lieu de jeter le modèle dans l'appel RenderPartial, et que vous utilisez un rasoir, vous pouvez modifier la première ligne de votre point de vue à partir de

@model dynamic

à

@model YourNamespace.YourModelType

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

Peut aussi être appelé

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

Il y a une autre raison que cela peut être jeté, même si vous ne l'utilisez dynamique / 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 » au lieu de la déclaration de type va lancer la même erreur, en dépit du fait que RootFolder est de type « dossier. En changeant le var du type réel, le problème disparaît.

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

Voici une manière de passer un objet dynamique dans une vue (ou vue partielle)

Ajoutez la classe suivante n'importe où dans votre solution (utilisation de l'espace de noms système, il est donc prêt à l'emploi sans avoir à ajouter des 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, le convertir en Expando:

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

Vive

J'ai eu le même problème et dans mon cas, ce que j'ai fait

@Html.Partial("~/Views/Cabinets/_List.cshtml", (List<Shop>)ViewBag.cabinets)

et Vue partielle

@foreach (Shop cabinet in Model)
{
    //...
}

Je jouais avec du code C# et j'ai accidentellement trouvé la solution à ton problème haha

Voici le code de la vue Principal :

`@model dynamic 
 @Html.Partial("_Partial", Model as IDictionary<string, object>)`

Puis dans la vue Partielle :

`@model dynamic 
 @if (Model != null) { 
   foreach (var item in Model) 
   { 
    <div>@item.text</div> 
   } 
  }`

Cela a fonctionné pour moi, j'espère que cela vous aidera aussi !!

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top