66

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

@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 文件中的相同代码可以完美运行。有什么想法吗?

4

7 回答 7

55

刚刚找到答案,看来我放置 RenderPartial 代码的视图具有动态模型,因此 MVC 无法选择正确的方法来使用。将 RenderPartial 调用中的模型转换为正确的类型解决了该问题。

来源:在 ascx 文件中使用 Html.RenderPartial()

于 2010-10-28T22:14:24.367 回答
26

而不是在 RenderPartial 调用中投射模型,并且由于您使用的是剃刀,您可以修改视图中的第一行

@model dynamic

@model YourNamespace.YourModelType

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

于 2011-03-18T19:43:21.597 回答
18

也可以称为

@Html.Partial("_PartialView", (ModelClass)View.Data)
于 2010-12-10T11:42:07.063 回答
8

即使您没有使用动态/ExpandoObject,还有另一个原因可以引发此问题。如果你正在做一个循环,像这样:

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

在这种情况下,“var”而不是类型声明将引发相同的错误,尽管 RootFolder 的类型为“Folder”。通过将 var 更改为实际类型,问题就消失了。

@foreach (ContentFolder folder in ViewBag.RootFolder.ChildFolders.ToList())
{
    @Html.Partial("ContentFolderTreeViewItems", folder)
}
于 2013-08-01T17:52:29.407 回答
4

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

在您的解决方案中的任何位置添加以下类(使用 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());

干杯

于 2012-04-01T04:16:16.897 回答
2

我遇到了同样的问题,就我而言,这就是我所做的

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

在部分视图中

@foreach (Shop cabinet in Model)
{
    //...
}
于 2016-04-15T08:00:15.967 回答
0

我在玩 C# 代码,我不小心找到了解决你问题的方法哈哈

这是主体视图的代码:

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

然后在部分视图中:

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

它对我有用,我希望这对你也有帮助!!

于 2019-05-08T01:04:55.463 回答