我很难确定MVC应用程序的导航位置。例如,假设您有以下结构:
Bulldogs
- Pac-10
- USC
- Hawaii
- Big East etc...
如何最好地创建一个结构来实现“主”导航和随后的“子”导航?使用假设的例子,您将为每个会议提供特定的子导航,显示其各自的学院(仅显示会议学院)。
你会在主视图中处理这件事,然后隐藏非选定的会议吗?或者你会创建一个菜单助手(或者是另一个部分),并从每个学院的观点来描述这一点吗?
发布于 2009-09-21 03:13:09
经过一段时间的思考和建议,我想出了这个解决方案。由于我的子导航将始终低于主导航,所以我决定采用约定而不是配置方法。
在我的Site.Master中,我有以下两个呈现部分。一个显示主导航,另一个调用BuildSubNavigation显示,获取要呈现的部分的名称:
<% Html.RenderPartial("_MainNavigation"); %>
<% var submenu = ViewContext.BuildSubNavigation();
if (submenu != null) {
Html.RenderPartial(submenu);
}%>当然,这可以交给帮手,而我打算这样做,这是更明确的,有助于理解这个问题。
这样做的目的是调用BuildSubNavigation方法。按照惯例,如果控制器要有一个特定的子导航,就会有一个以"_Navigation“的形式出现的部分,因此,按照示例的精神,其中一个部分将是"_SouthEasternConferenceNavigation”,然后检查当前视图是否真的存在。如果是这样的话,我将返回名称,然后将其用于呈现部分。
public static string BuildSubNavigation(this ViewContext vc) {
var controller = vc.RouteData.Values["controller"] ?? "";
var viewName = "_" + controller + "Navigation";
if (ViewExists(vc.Controller.ControllerContext, viewName, null)) {
return viewName;
} else {
return null;
}
}这是一种检查视图是否实际存在于当前视图引擎的方法:
public static bool ViewExists(ControllerContext cc, string viewName, string masterName) {
if (ViewEngines.Engines.FindView(cc, viewName, masterName).View != null) {
return true;
} else { return false; }
}我不确定这是否是最好的方法,但对于我目前正在做的一个小项目来说,它运行得相当好。
谢谢你的回答!
发布于 2009-09-20 20:05:09
最好的方法是使用多个嵌套的母版页。例如,Site.master将包含您的顶级导航(会议列表?)然后,您将为每个会议提供一个不同的母版页,以“扩展”site.master。理论上,您可以拥有任意数量的嵌套母版页。最后,佛罗里达鳄鱼等将是“真实的”视图(即非母版页)。
棘手的部分是告诉任何父母版页当前选择了哪个导航项。由于无法将母版页绑定到ViewModel,所以必须使用“视图字典”,例如“查看”“SelectedMainNavItem”。
发布于 2009-09-20 20:12:33
为什么不使用总显示主导航的全局布局模板,并依赖某个助手来呈现子导航呢?(助手可能是多余的--您可能只是在布局模板中输出子导航内联)
控制器将当前类别/子类别以及描述当前子导航选项的某些数据结构传递给视图。
https://stackoverflow.com/questions/1451838
复制相似问题