【发布时间】:2010-10-04 04:10:02
【问题描述】:
我正在寻找有关如何在 ASP.NET MVC 应用程序中使用 Session 的想法?尤其是在使用母版页并试图在不绕过控制器的情况下将数据获取到母版页时。这个问题一开始是我问了很多小问题,但后来我设法将它塑造成一个我还没有实施但有点可行的解决方案。如有任何反馈,将不胜感激。
我提出的解决方案又名“除非有人说停止,否则我将要实施的方案!”
我的模型类继承自 ModelBase——它包含母版页所需的信息(每页只有一个视图),用于显示在标头或页脚中的某些内容以及基于谁的配置驱动设置已登录。
我的最佳解决方案如下 - 此处显示为“产品页面”:
假设:我在某些时候已经将某些数据卡在会话中 - 例如可能是通过网关页面进入的
partnerId,或者currentLoggedInUserEmail属性或完全成熟的对象.我有一个
ModelBase类,每个模型(例如ProductModel)都从该类继承我有一个
MySiteControllerBase类(从 Controller 继承) - 它是ProductController的子类。在
ProductController的操作方法中,我使用'new ProductModel()'为产品视图创建模型。这个模型类本身对会话或如何填充ModelBase一无所知。它本质上甚至不知道ModelBase——它只是继承自它。我的链式构造函数什么都不做(因为我不想传递它Session)。对于所有采用模型参数的重载,我在
MySiteControllerBase中覆盖View(...)。我检查该参数是否为ModelBase类型,如果是,我填充诸如partnerid和currentLoggedInuserEmail之类的属性。幸运的是,因为我在一个继承自Controller的类中,所以我可以直接访问Session,所以我可以直接将它们从那里拉出来。
这种方法意味着ModelBase 上的属性仅由我执行'return View(model)' 自动填充。但是,如果ProductModel 的模型需要访问ModelBase 上定义的任何内容,则会出现一个明显的问题。它将为 null,因为它尚未填充。
这个问题可以通过将Session 传递给new ProductModel(session) 来解决,而new ProductModel(session) 又会将它通过构造函数链传递给new ModelBase(session)。我真的不喜欢那个解决方案,因为我喜欢将模型视为一个非常愚蠢的数据结构,根本不应该知道任何外部数据结构。另一种解决方案可能是直接使用它,如果我发现ProductController 需要消耗ModelBase 中定义的任何内容,我只需创建一个方法MySiteControllerBase.UpdateModelBase(productModel, session) 以在ProductController 中显式填充它。我希望这很清楚!
想到的其他问题是:
- 单元测试呢? MVC 中的会话状态是否有任何抽象,或者我应该自己构建?我在源代码中搜索了“会话”,但没有任何结果!
- 会话跟踪如何与 MVC 中的 /REST/FUL/URLS 一起工作?我需要了解有关关闭 cookie 的任何问题吗?
- 我是否应该以不同于以往的方式来看待会话?
【问题讨论】:
标签: asp.net-mvc session master-pages