Render Teilansicht mit dynamischem Modell in Klingen Ansicht Motor und ASP.NET MVC 3
-
27-09-2019 - |
Frage
Wenn ich versuche, eine Teilansicht, dessen Modelltypen zu machen ist wie folgt angegeben:
@model dynamic
durch den folgenden Code:
@{Html.RenderPartial("PartialView", Model.UserProfile);}
ich die folgende Ausnahme erhalten:
'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.
Allerdings funktioniert der gleiche Code in einer ASPX-Datei einwandfrei. Irgendwelche Gedanken?
Lösung
gefunden einfach die Antwort, scheint es, dass die Ansicht, wo ich den RenderPartial Code wurde, indem ein dynamisches Modell hatte, und somit konnte MVC die richtige Methode zur Nutzung nicht zur Verfügung. Gießen Sie das Modell in der RenderPartial Aufruf an den richtigen Typ das Problem behoben.
Andere Tipps
Anstatt das Modell in dem RenderPartial Anruf Gießen, und da Sie Rasierer verwenden, können Sie die erste Zeile in der Ansicht von
ändern@model dynamic
@model YourNamespace.YourModelType
Dies hat den Vorteil der Arbeit an jedem @Html.Partial
Anruf Sie in der Ansicht haben, und gibt Ihnen auch Intellisense für die Eigenschaften.
Auch als aufgerufen werden
@Html.Partial("_PartialView", (ModelClass)View.Data)
Es gibt einen weiteren Grund, dass dies geworfen werden kann, auch wenn Sie nicht dynamisch / ExpandoObject verwenden. Wenn Sie eine Schleife tun, wie folgt aus:
@foreach (var folder in ViewBag.RootFolder.ChildFolders.ToList())
{
@Html.Partial("ContentFolderTreeViewItems", folder)
}
In diesem Fall wird die „var“ anstelle der Typdeklaration der gleichen Fehler werfen, trotz der Tatsache, dass RootFolder vom Typ „Folder ist. Durch die var auf die tatsächliche Art zu ändern, das Problem verschwindet.
@foreach (ContentFolder folder in ViewBag.RootFolder.ChildFolders.ToList())
{
@Html.Partial("ContentFolderTreeViewItems", folder)
}
Hier ist ein Weg, um ein dynamisches Objekt zu einer Ansicht zu übergeben (oder Teilansicht)
Fügen Sie die folgende Klasse überall in Ihrer Lösung (Verwendung System-Namespace, so dass sie bereit, ohne verwenden alle Verweise hinzuzufügen) -
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;
}
}
}
Wenn Sie das Modell zur Ansicht schicken, wandelt es in Expando:
return View(new {x=4, y=6}.ToExpando());
Prost
Ich hatte das gleiche Problem und in meinem Fall ist das, was ich tat
@Html.Partial("~/Views/Cabinets/_List.cshtml", (List<Shop>)ViewBag.cabinets)
und in Teilansicht
@foreach (Shop cabinet in Model)
{
//...
}
Ich habe das Spiel mit C # -Code ein fand ich versehentlich die Lösung für Ihr Problem haha ??
Dies ist der Code für die Hauptansicht:
`@model dynamic
@Html.Partial("_Partial", Model as IDictionary<string, object>)`
Dann in der Teilansicht:
`@model dynamic
@if (Model != null) {
foreach (var item in Model)
{
<div>@item.text</div>
}
}`
Es funktionierte für mich, ich hoffe, dies wird Ihnen helfen, auch !!