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

5
有人能详细解释一下,为什么对于像动态菜单这样的东西,你需要在每个操作中定义ViewData["MenuData"]吗?
我有一个简单的局部视图,用于呈现菜单,我从主页中呈现此菜单。对我来说,这是直观的,因为我来自ASP.NET WebForms,但是我唯一能够填充菜单的方法是传递ViewData["MenuData"],但是这样我就必须在每个控制器操作中执行此操作。这确实感觉有点愚蠢,我不想每次都定义此视图数据。
在可测试性和ASP.NET MVC风格方面,我应该如何处理这个问题?
2个回答

4
另一种选择是使用RenderAction方法,它会调用一个动作(可以是当前控制器上的动作,或者如果您也提供了控制器名称,那么就是该控制器),该动作可以为您构建菜单数据并调用您的ascx局部视图:
因此,在我的母版页上,我可以有:
<% Html.RenderAction("MenuArchiveList"); %>

然后在我的控制器中:
public ActionResult MenuArchiveList() {
  return PartialView("BlogArchiveList",
                     _BlogRepository.GetArchiveYearPostCounts());
}

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

如果您想确保您的操作仅在部分视图的上下文中调用,则应使用ChildActionOnlyAttribute进行修饰。

此功能是从Microsoft.Web.Mvc的“futures”命名空间添加到System.Web.Mvc的2.0版本中。


0
你应该使用一个基础控制器来处理重复的视图模型填充,然后让所有的控制器都从它派生出来。
请参见视图模型最佳实践

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接