Asp.net mvc 在Razor视图引擎和ASP.NET MVC 3中使用动态模型渲染局部视图

Asp.net mvc 在Razor视图引擎和ASP.NET MVC 3中使用动态模型渲染局部视图,asp.net-mvc,razor,asp.net-mvc-3,Asp.net Mvc,Razor,Asp.net Mvc 3,当我尝试渲染模型类型指定为的局部视图时: @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 t

当我尝试渲染模型类型指定为的局部视图时:

@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.
“System.Web.Mvc.HtmlHelper”没有名为“RenderPartial”的适用方法,但似乎有一个同名的扩展方法。无法动态调度扩展方法。考虑在不使用扩展方法语法的情况下强制转换动态参数或调用扩展方法。

但是,在.aspx文件中的相同代码可以完美地工作。有什么想法吗?

刚刚找到答案,似乎我放置渲染部分代码的视图有一个动态模型,因此,MVC无法选择正确的使用方法。将RenderPartial调用中的模型强制转换为正确的类型修复了该问题

来源:

也可以称为

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

不必在RenderPartial调用中强制转换模型,因为您使用的是razor,所以可以从中修改视图中的第一行

@model dynamic


这样做的好处是可以处理视图中的每个
@Html.Partial
调用,还可以为属性提供智能感知。

下面是一种将动态对象传递给视图(或部分视图)的方法

在解决方案中的任意位置添加以下类(使用系统名称空间,这样就可以在不添加任何引用的情况下随时使用它)——


干杯

即使您没有使用dynamic/ExpandooObject,也有另一个原因可以抛出此选项。如果您正在执行循环,如下所示:

@foreach (var folder in ViewBag.RootFolder.ChildFolders.ToList())
{
    @Html.Partial("ContentFolderTreeViewItems", folder)
}
在这种情况下,“var”而不是类型声明将抛出相同的错误,尽管RootFolder的类型是“Folder”

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

我也有同样的问题&就我而言,这就是我所做的

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

我在玩C#代码我意外地找到了你问题的解决方案哈哈

这是主体视图的代码:

`@model dynamic 
 @Html.Partial("_Partial", Model as IDictionary<string, object>)`
`@模型动态
@Html.Partial(“_Partial”,作为IDictionary的模型)`
然后在局部视图中:

`@model dynamic 
 @if (Model != null) { 
   foreach (var item in Model) 
   { 
    <div>@item.text</div> 
   } 
  }`
`@模型动态
@如果(Model!=null){
foreach(模型中的var项目)
{ 
@item.text
} 
}`

这对我来说很有效,我希望这也能对你有所帮助!!

对,这不起作用的主要原因是C不支持调用扩展方法(这就是
Html.RenderPartial()
的功能)当任何参数为动态类型时。您必须静态调用扩展方法或将参数强制转换为非动态类型。这有一个缺点,即它会生成一个临时的(并且可能较大的)
MvcHtmlString
,而不是直接写入输出。我发现我需要这样转换我的模型,即使我的模型没有声明为
dynamic
。这可能是因为我的模型是一个列表。+1对于我来说似乎比Diego的建议更合理——原因如上所述。例如,如果你知道在您正在处理的类型上,然后处理该类型!没有意义。如果我想使用动态模型,我希望帮助者能帮助我。在大多数情况下,动态模型更简单、更高效,因为您不必声明类。@ema-使用动态模型也会导致更草率、考虑不周的代码。ViewModels几乎是总是比动态模型更好的主意。除非您喜欢在运行时查找编译错误!@JoshM。使用
ViewBag
(又称动态模型)时也会发生这种情况,它适合传递“客户端”“变量、一次性使用等,实际上不需要使用或维护全新的ViewModel类。@MattBorja确实如此。动态的东西会留下错误的空间,但如果使用得当,它确实很有用。
@Html.Partial("~/Views/Cabinets/_List.cshtml", (List<Shop>)ViewBag.cabinets)
@foreach (Shop cabinet in Model)
{
    //...
}
`@model dynamic 
 @Html.Partial("_Partial", Model as IDictionary<string, object>)`
`@model dynamic 
 @if (Model != null) { 
   foreach (var item in Model) 
   { 
    <div>@item.text</div> 
   } 
  }`