【问题标题】:Persist menu tree state across views - ASP.NET MVC 3跨视图保持菜单树状态 - ASP.NET MVC 3
【发布时间】:2012-02-10 15:13:57
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢。我记得原因是单元测试。类似于在控制器操作中使用模型绑定而不是直接访问 FormsCollection 更好的方式。问题是我在布局上使用了子操作,所以我不确定模型绑定是否是一个选项。
    【解决方案2】:

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

    渲染局部视图的操作将接受参数来渲染状态。 每个链接都将调用具有不同参数的操作。

    例如,

    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
    }
    

    【讨论】:

    • 感谢您的回复!那么,您将如何将菜单从请求保留到请求?
    • 不要通过请求来请求。最好将其视为一页一页。每个页面的菜单都是不同的。可以在每个页面中使用不同的参数调用局部视图。
    • 那么参数从哪里来?请求参数?会话?
    • 我更喜欢查询字符串而不是会话。由于查询字符串方法将是无状态行为。无论会话如何,相同的 url 都会产生相同的视图。但是如果你想进行会话,那么 Cookies 会比服务器端会话更好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多