传递到字典中的模型项是类型的

dan*_*ich 3 asp.net-mvc

我有一个我理解的错误,但无法想出以正确的方式解决.

我有一个MasterPage,从那个MasterPage我打电话:

<% Html.RenderPartial("Tags"); %>
Run Code Online (Sandbox Code Playgroud)

Tags是一个强类型视图,如下所示:

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<IEnumerable<JegManglerEn.Controllers.CategoryCount>>" %>
Run Code Online (Sandbox Code Playgroud)

我像这样返回PartialView:

return View("Tags", result);
Run Code Online (Sandbox Code Playgroud)

结果是正确的和类型:

List<CategoryCount>
Run Code Online (Sandbox Code Playgroud)

错误是这样的:

传递到字典中的模型项的类型为'System.Collections.Generic.List 1[JegManglerEn.Item]', but this dictionary requires a model item of type 'System.Collections.Generic.IEnumerable1 [JegManglerEn.Controllers.CategoryCount]'.

所以设置如下:

MasterPage加载一个带有JegManglerEn.Item集合的View,并尝试加载一个带有JegManglerEn.Controllers.CategoryCount集合的PartialView ......但是没有这样做.

我知道它与RenderPartial方法有关,因为如果我将它改为RenderAction,它的效果很好.

如果你们有答案,我可以跳过查看MVC soruce或启动Reflector.

谢谢!

Jon*_*øgh 5

当您调用Html.RenderPartial的单参数重载时,您隐式将父视图的整个模型向下传递给partial.这不起作用,因为视图所期望的模型类型不匹配.

让RenderPartial在上下文中工作的最简单方法是创建一个包含Tags和页面模型数据的复合模型类型,然后调用将父模型的一部分传递给partial的重载:

Html.RenderPartial("Tags", Model.Tags);
Run Code Online (Sandbox Code Playgroud)

话虽这么说,我认为RenderAction很可能是这里的方式,因为它可以更容易地避免控制器中的重复代码(当然,假设您以相同的方式为从主页继承的所有页面加载标签数据问题).