MVC为区域中的所有视图定义@section

时间:2014-03-12 21:53:48

标签: asp.net-mvc asp.net-mvc-5

我的布局中有一个容器,我想显示一个菜单项列表,我希望根据我们正在查看的网站区域显示其他菜单项。

我知道我可以使用@section执行此操作,但这意味着我必须在区域内的每个视图中复制部分内容,这将是一个维护混乱和令人讨厌的DRY违规。多个每区域布局也是不合需要的代码重复。

在_ViewStart部分中进行它会很好,但显然MVC不允许在部分中定义@section。我还能做什么?

2 个答案:

答案 0 :(得分:1)

创建一个控制器和动作来满足这一要求,我通常会使用NavigationController行为或类似行为MainMenu

在你的行动中:

public ActionResult MainMenu()
{
    return PartialView();
}

您可以使用的网站布局或视图中的任何位置:

@{ Html.RenderAction("MainMenu", "Navigation"); }

这也意味着您可以在操作中包含任何业务逻辑并将模型传递给MainMenu,也可以用于检查角色等。

非常方便。

答案 1 :(得分:1)

我会考虑在一些通用控制器中创建一个动作方法,该控制器返回带有正确菜单项的正确局部视图。

[ChildActionOnly]
public PartialViewResult GetSubMenu(){
   var areaName = ViewContext.RouteData.DataTokens["area"];
   switch(areaName){
      case "Admin":
         return PartialView("_adminSubMenu");
      ....
      case default:
         //not sure on how to return nothing exactly
         return null;
   }
}

在您的布局中

@{Html.RenderAction("GetSubMenu","GenericControllerName");}