有人可以详细说明为什么要为动态菜单之类的动作定义ViewData [“MenuData”]吗?
我有一个简单的局部视图,它呈现一个菜单,我在一个母版页中渲染这个菜单。这对我来自ASP.NET WebForms是直观的,但是我填充菜单的唯一方法是传递ViewData [“MenuData”],但是我必须在每个控制器动作中执行此操作。它确实感觉有点愚蠢,我每次都必须定义这个视图数据。
在可测试性和ASP.NET MVC方面,我该如何处理?
答案 0 :(得分:4)
另一个选择是使用RenderAction
方法来调用一个动作(在当前控制器上,或者如果你提供一个控制器名称,那个控制器),然后可以构建菜单数据你,并调用你的ascx局部视图:
所以在我的母版页上,我可以:
<% Html.RenderAction("MenuArchiveList"); %>
然后在我的控制器中:
public ActionResult MenuArchiveList() {
return PartialView("BlogArchiveList",
_BlogRepository.GetArchiveYearPostCounts());
}
然后成功找到用户控件\Views\Shared\BlogArchiveList.ascx
如果您想确保只在部分视图的上下文中调用您的操作,那么您应该使用ChildActionOnlyAttribute
来装饰它。
这是从“期货”命名空间Microsoft.Web.Mvc添加到版本2中的System.Web.Mvc。
答案 1 :(得分:0)
您应该使用一个基本控制器来处理视图模型的重复填充,然后让所有控制器从中派生出来