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