跨视图保持菜单树状态 - ASP.NET MVC 3

时间:2012-01-15 02:32:51

标签: asp.net-mvc-3 cookies session-state

我想要在我的布局上提供此菜单(基本上是我网站上的每个视图)。我希望跨页面请求维护菜单的状态(无论是否打开或关闭树项)。我想要做的是可能有一个从我的布局页面调用的子操作,它抓取一些包含树状态信息的cookie或会话信息,这样我就可以完全重建树的最后一个请求。我的问题是,从我读到的,从一个控制器动作中调用Session和Cookie之类的东西是不好的做法。我想知道的是解决这个问题的更优雅的方法。如果我必须使用Cookie和Session,任何人都有关于如何模拟它们的想法?谢谢

2 个答案:

答案 0 :(得分:1)

  

我的问题是,从我读到的内容来看,调用类似的东西是不好的做法   来自内部控制器操作的会话和Cookie

有趣。这篇文章的作者是否解释了为什么这是一个不好的做法?从控制器操作访问会话和cookie没有任何问题。实际上使用会话进行此类事情可能不合适,因为如果用户关闭浏览器,您将无法持久保存树的布局,而使用持久性cookie可能。

答案 1 :(得分:0)

我们可以将菜单作为部分视图。

“渲染部分视图的动作”将接受用于渲染状态的参数。 每个链接都将使用不同的参数调用该操作。

例如,

public PartialViewResult RenderNavigation(int Menuroot, int subMenuItem)
{
IList<MyNavigationItem> navigationItems=GetNavigation();// Some method that'll read nvigationitems.
navigationItems.Where(n=> n.menuId.Equals(Menuroot) ||n.IsOpen.Equals(subMenuItem)).ToList().ForEach(i=> i.IsOpen=true);

return View("SomeMenuView",navigationItems);
}

public class MyNavigationItem{
int menuId{get;set;}
bool IsOpen{get;set;}
int parentMenuId{get;set;} // set default -1 for Root Items
}