ASP.NET MVC,部分视图和数据

Joh*_*ren 5 dynamic-data asp.net-mvc-2

任何人都可以详细说明为什么你在动态菜单之类的每个动作上定义ViewData ["MenuData"]的原因?

我有一个简单的局部视图,它呈现一个菜单,我在一个母版页中渲染这个菜单.这对我来自ASP.NET WebForms是直观的,但是我填充菜单的唯一方法是传递ViewData ["MenuData"],但是我必须在每个控制器动作中执行此操作.它确实感觉有点愚蠢,我每次都必须定义这个视图数据.

在可测试性和ASP.NET MVC方面,我该如何处理?

Zha*_*uid 4

另一种选择是使用该RenderAction方法,该方法将调用一个操作(在当前控制器上,或者如果您还提供控制器名称,则该控制器),然后该方法可以为您构建菜单数据,并调用您的 ascx 部分视图:

所以在我的主页上我可以有:

<% Html.RenderAction("MenuArchiveList"); %>
Run Code Online (Sandbox Code Playgroud)

然后在我的控制器中:

public ActionResult MenuArchiveList() {
  return PartialView("BlogArchiveList",
                     _BlogRepository.GetArchiveYearPostCounts());
}
Run Code Online (Sandbox Code Playgroud)

这样就成功找到了用户控件\Views\Shared\BlogArchiveList.ascx

如果您想确保您的操作仅在部分视图的上下文中被调用,那么您应该使用ChildActionOnlyAttribute.

这是从“futures”命名空间 Microsoft.Web.Mvc 添加到版本 2 中的 System.Web.Mvc 中的。