2010-06-24 89 views
5

任何人都可以详细说明为什么要为动态菜单等每个动作定义ViewData [“MenuData”]?ASP.NET MVC,部分视图和数据

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

就可测试性和ASP.NET MVC-ish而言,我应该如何处理这个问题?

回答

4

另一种选择是使用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中添加的。

+0

这就是东西。谢谢。 – 2010-06-24 15:25:33

+0

没问题,很高兴。 – 2010-06-24 15:31:07

0

您应该使用基本控制器负责处理您的视图模型的反复人口,然后让所有的控制器能从中得到

看到这里ViewModel Best Practices