在Razor视图引擎和ASP.NET MVC 3中用dynamic模型渲染部分视图
当我尝试渲染模型types被指定为的部分视图:
@model dynamic
通过使用以下代码:
@{Html.RenderPartial("PartialView", Model.UserProfile);}
我得到以下例外:
'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.
但是.aspx文件中的相同代码完美地工作。 有什么想法吗?
刚刚find答案,看来我放置RenderPartial代码的视图有一个dynamic模型,因此,MVC无法select正确的方法来使用。 将RenderPartial调用中的模型转换为正确的types解决了问题。
源代码: 在ascx文件中使用Html.RenderPartial()
而不是在RenderPartial调用中投射模型,而且由于您使用的是razor,因此您可以修改视图中的第一行
@model dynamic
至
@model YourNamespace.YourModelType
这样做的好处是可以在视图中调用每个@Html.Partial
调用,并且还为您提供了对属性的智能感知。
也可以称为
@Html.Partial("_PartialView", (ModelClass)View.Data)
还有另外一个原因,即使你不使用dynamic/ ExpandoObject,也可能会抛出这个问题。 如果你正在做一个循环,像这样:
@foreach (var folder in ViewBag.RootFolder.ChildFolders.ToList()) { @Html.Partial("ContentFolderTreeViewItems", folder) }
在这种情况下,尽pipe事实上RootFolder的types是“Folder”,“var”代替types声明将抛出相同的错误。通过将var更改为实际types,问题就消失了。
@foreach (ContentFolder folder in ViewBag.RootFolder.ChildFolders.ToList()) { @Html.Partial("ContentFolderTreeViewItems", folder) }
这是一种将dynamic对象传递给视图(或局部视图)的方法
在解决scheme的任何位置添加以下类(使用System命名空间,因此可以使用而无需添加任何引用) –
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; } } }
将模型发送到视图时,将其转换为Expando:
return View(new {x=4, y=6}.ToExpando());
干杯
我有同样的问题,在我的情况下,这是我所做的
@Html.Partial("~/Views/Cabinets/_List.cshtml", (List<Shop>)ViewBag.cabinets)
并在部分视图
@foreach (Shop cabinet in Model) { //... }