任何人都可以详细说明为什么要为动态菜单等每个动作定义ViewData [“MenuData”]?ASP.NET MVC,部分视图和数据
我有一个简单的局部视图呈现菜单,我从母版页中呈现此菜单。这对于我从ASP.NET WebForms来说很直观,但填充菜单的唯一方法是传递ViewData [“MenuData”],但是我必须在每个控制器操作中执行此操作。它确实感觉有点愚蠢,我不得不每次定义这个视图数据。
就可测试性和ASP.NET MVC-ish而言,我应该如何处理这个问题?
任何人都可以详细说明为什么要为动态菜单等每个动作定义ViewData [“MenuData”]?ASP.NET MVC,部分视图和数据
我有一个简单的局部视图呈现菜单,我从母版页中呈现此菜单。这对于我从ASP.NET WebForms来说很直观,但填充菜单的唯一方法是传递ViewData [“MenuData”],但是我必须在每个控制器操作中执行此操作。它确实感觉有点愚蠢,我不得不每次定义这个视图数据。
就可测试性和ASP.NET MVC-ish而言,我应该如何处理这个问题?
另一种选择是使用RenderAction
方法来代替这将调用一个动作(在当前控制器上,或者如果您提供了控制器名称),然后可以为您创建菜单数据,并调用您的ascx局部视图:
因此,在我的母版页我可以有:
<% Html.RenderAction("MenuArchiveList"); %>
然后在我的控制器:
public ActionResult MenuArchiveList() {
return PartialView("BlogArchiveList",
_BlogRepository.GetArchiveYearPostCounts());
}
这则成功地找到用户控制\Views\Shared\BlogArchiveList.ascx
如果你想确保你的行动只会被调用的局部视图的上下文,那么你应该使用ChildActionOnlyAttribute
来装饰它。
这是从“futures”命名空间Microsoft.Web.Mvc的版本2中的System.Web.Mvc中添加的。
您应该使用基本控制器负责处理您的视图模型的反复人口,然后让所有的控制器能从中得到
这就是东西。谢谢。 – 2010-06-24 15:25:33
没问题,很高兴。 – 2010-06-24 15:31:07