我正在.Net MVC 4 中开发一个相当大的应用程序,其中我有一个主菜单来导航区域和一个子菜单来导航一个区域的组件。
显然,这个子菜单在每个区域都是不同的,目前我已经使用 Viewbag “解决”了这个问题。
我有一个带有一些抽象方法的主控制器:
public abstract class BaseController: Controller
{
protected abstract string GetMenu();
protected override sealed void OnResultExecuting(ResultExecutingContext filterContext)
{
ViewBag.Menu = GetMenu();
base.OnResultExecuting(filterContext);
}
}
并且每个区域也都有其基本控制器,并带有以下声明
public abstract class Area1Controller: BaseController
{
protected string GetMenu()
{
return "MenuNameForArea1";
}
}
在我的 _Layout 中,我只需像这样访问菜单:
@{
var menu = ViewBag.Menu as string;
if (menu != null)
{
Html.RenderPartial(menu);
}
}
现在的问题是,有相当多的变量加入了“需要在 _Layout 页面上显示但每个区域不同的东西”的包中。
所以我想知道解决这个问题的最佳解决方案是什么。我是否为 _Layout 页面制作 ViewModel?我是否将该 ViewModel 放在 ViewBag 中,还是强制每个 viewmodel 从基本 viewmodel 继承?
由于每个区域都有其单独的 _Viewstart,我曾想过使用部分以类型安全的方式解决此问题,但不幸的是,我似乎无法在 _Viewstart 中定义部分。
建议将非常受欢迎。
额外的问题:什么是一个好的解决方案:
- 在主菜单中显示当前活动区域(每个区域配置一次)
- 在子菜单中显示当前活动的项目(每个控制器配置一次,但应该可以覆盖特定的东西)