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

时间:2010-10-28 22:07:34

标签: 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 that name. Extension methods cannot be dynamically dispatched. Consider casting the dynamic arguments or calling the extension method without the extension method syntax.

然而,.aspx文件中的相同代码完美无瑕。有什么想法吗?

7 个答案:

答案 0 :(得分:54)

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

来源:Using Html.RenderPartial() in ascx files

答案 1 :(得分:26)

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

@model dynamic

@model YourNamespace.YourModelType

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

答案 2 :(得分:17)

也可以称为

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

答案 3 :(得分:7)

即使你没有使用dynamic / 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)
}

答案 4 :(得分:3)

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

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

干杯

答案 5 :(得分:0)

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

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

和部分视图

@foreach (Shop cabinet in Model)
{
    //...
}

答案 6 :(得分:0)

我在玩C#代码时,偶然发现了问题的解决方案哈哈

这是Principal视图的代码:

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

然后在部分视图中:

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

它为我工作,希望对您有帮助!