我的布局中有一个容器,我想显示一个菜单项列表,我希望根据我们正在查看的网站区域显示其他菜单项。
我知道我可以使用@section
执行此操作,但这意味着我必须在区域内的每个视图中复制部分内容,这将是一个维护混乱和令人讨厌的DRY违规。多个每区域布局也是不合需要的代码重复。
在_ViewStart部分中进行它会很好,但显然MVC不允许在部分中定义@section
。我还能做什么?
答案 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");}