Il rendering parziale vista con il modello dinamico nel motore di visualizzazione di Rasoio e ASP.NET MVC 3
-
27-09-2019 - |
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?
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.
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!!