Il rendering parziale vista con il modello dinamico nel motore di visualizzazione di Rasoio e ASP.NET MVC 3

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

Domanda

Quando cerco di eseguire il rendering di una vista parziale, il cui modello è specificato il tipo come:

@model dynamic

utilizzando il seguente codice:

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

Ho la seguente eccezione:

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

Tuttavia, lo stesso codice in un .file aspx funziona perfettamente.Ogni pensiero?

È stato utile?

Soluzione

Appena trovato la risposta, sembra che la vista in cui mi è stato l'inserimento del codice RenderPartial aveva un modello dinamico, e quindi, MVC non poteva scegliere il metodo corretto da utilizzare. Casting il modello nella chiamata RenderPartial al tipo corretto risolto il problema.

fonte: Utilizzando Html.RenderPartial () nel file ascx

Altri suggerimenti

Al posto di colare il modello nella chiamata RenderPartial, e dal momento che si sta utilizzando rasoio, è possibile modificare la prima linea nella vista da

@model dynamic

a

@model YourNamespace.YourModelType

Questo ha il vantaggio di lavorare su ogni chiamata @Html.Partial si ha nella vista, e ti dà anche IntelliSense per le proprietà.

Può anche essere chiamato come

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

C'è un altro motivo che questo può essere gettato, anche se non si sta usando dinamica / ExpandoObject. Se si sta facendo un ciclo, in questo modo:

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

In questo caso, il "var" al posto della dichiarazione del tipo getterà lo stesso errore, nonostante il fatto che RootFolder è di tipo "Folder. Modificando la var per il tipo effettivo, il problema va via.

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

Ecco un modo per passare un oggetto dinamico per una vista (vista parziale o)

Aggiungere il seguente ovunque classe nella soluzione (uso namespace System, per cui il suo pronto per l'uso, senza dover aggiungere alcun riferimento) -

    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;
            }

        }
    }

Quando si invia il modello alla vista, convertirlo in Expando:

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

Saluti

Ho avuto lo stesso problema e nel mio caso questo è quello che ho fatto

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

ed in vista parziale

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

Sono stato a giocare con codice C# un inavvertitamente ho trovato la soluzione al tuo problema haha

Questo è il codice per la visione Principali:

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

Poi in vista Parziale:

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

Ha funzionato per me, spero che questo ti aiuterà anche a voi!!

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top