2012-01-15 71 views
0

我有这个菜单,我想让我的布局(基本上是我网站上的所有视图)都可用。我希望在页面请求中维护菜单的状态(是否打开或关闭树项目)。我想要做的是可能有一个从我的布局页面调用的子动作,它捕获包含树状态信息的一些cookie或会话信息,以便我可以重新构建树,确切地说它是最后一次请求的方式。我的问题是,从我读的内容来看,从控制器的动作中调用诸如Session和Cookie之类的东西是不好的做法。我想知道的是解决这个问题的更优雅的方式。如果我必须使用Cookie和Session,任何人都有如何嘲笑他们的想法?谢谢在视图中保留菜单树状态 - ASP.NET MVC 3

回答

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 
} 
+0

感谢您的回应!那么,如何坚持从请求到请求的菜单呢? – enamrik 2012-01-15 07:56:11

+0

不要通过请求去请求。最好把它看成是一页一页的。对于每个页面菜单是不同的。可以在不同参数的每个页面中调用部分视图。 – Manas 2012-01-15 17:35:12

+0

所以参数会来自哪里?请求参数?会议? – enamrik 2012-01-15 17:40:23

1

我的问题是,从我读,这是不好的做法,那些控制器动作

有趣内调用之类的东西 会话和饼干从。这篇文章的作者是否解释了为什么这是一种不好的做法?从控制器操作访问会话和cookie没有任何问题。实际上,使用会话来处理这种事情可能并不合适,因为如果用户关闭浏览器,您将无法坚持树的布局,而使用持久cookie将是可能的。

+0

谢谢。我记得原因是单元测试。按照相同的方式排序,最好在控制器操作中使用模型绑定,而不是直接访问FormsCollection。问题是我在布局上使用了一个子动作,所以我不确定modelbinding是否是一个选项。 – enamrik 2012-01-15 17:12:07