我应该如何将会话状态集成到ASP.NET MVC应用程序中?

Sim*_*ver 7 asp.net-mvc session master-pages

我正在寻找关于如何在ASP.NET MVC应用程序中使用Session的想法?特别是在使用masterpages和tryin只是将数据传输到母版页而不绕过控制器时.这个问题始于我提出了许多小问题,但后来我设法把它塑造成一个解决方案,但我还没有实现,但有一个方面是可行的.非常感谢任何反馈.


我建议的解决方案又名'我即将实施的内容,除非有人说停止!'

我有继承自ModelBase的模型类 - 它包含母版页所需的信息(每页只有一个视图),用于显示在标头或页脚中的某些内容以及基于登录者的配置驱动设置.

我的最佳解决方案如下所示 - 此处显示的是"产品页面":

假设:我在某些时候已经在会话中粘贴了某些数据 - 例如,可能是partnerId通过网关页面或currentLoggedInUserEmail属性或完全爆炸的对象传入的数据.

我有一个ModelBase类,每个模型都有 - 比如ProductModel继承

我有一个MySiteControllerBase类(继承自Controller) - 由子类化ProductController.

在我的动作方法中,ProductController我用产品视图创建模型'new ProductModel()'.此模型类本身对会话或如何填充一无所知ModelBase.它本质上甚ModelBase至不知道- 它只是从它继承而来.我的链式构造函数什么都不做(因为我不想传递它Session).

我重写View(...)MySiteControllerBase为所有需要模型参数的重载.我检查该参数是否属于类型ModelBase,如果是,我填充了诸如partnerid和之类的属性currentLoggedInuserEmail.幸运的是因为我在一个继承自我的类中Controller可以直接访问,Session所以我可以直接将它们拉出来.

这种方法意味着ModelBase我只是自动填充属性'return View(model)'.但是,如果模型ProductModel需要访问任何定义的内容,则存在明显的问题ModelBase.它将变为null,因为它尚未填充.

这个问题可以通过传入来解决,然后Sessionnew ProductModel(session)其传递给构造函数链new ModelBase(session).我真的喜欢这个解决方案,但因为我喜欢将模型看作一个非常愚蠢的数据结构,根本不应该知道任何外部数据结构.另一个解决方案可能就是将它放在一边,如果我发现ProductController需要消耗任何定义的内容ModelBase,我只需要创建一个方法MySiteControllerBase.UpdateModelBase(productModel, session)来显式填充它ProductController.我希望那清楚!

其他想到的问题是:

  • 单元测试怎么样?在MVC中是否有关于Session状态的抽象或我应该构建自己的抽象?我在源代码中搜索了"会话",但没有出现!
  • 会话跟踪如何与MVC中的/ REST/FUL/URLS一起使用?我需要知道关于饼干的问题吗?
  • 我是否应该考虑与传统方式不同的会话?

Cra*_*ntz 1

尽管原则上在 ASP.NET MVC 应用程序中使用 Session 没有什么问题(嗯,至少没有比在其他 ASP.NET 应用程序中使用它更错误的了......),但我倾向于认为它应该是最后的手段,当其他事情不起作用时。

尽管您的问题通常写得很好,但您没有详细说明您建议在会话中存储的内容。我在你的问题中找到的两个例子是:

  • 当前用户电子邮件
  • 合作伙伴ID

用户的电子邮件地址已可通过表单身份验证获得(如果您正在使用该身份验证),并且可以将其添加到尚不支持它的其他 ASP.NET 成员资格提供程序中。目前尚不清楚partnerid实际上是什么,但我怀疑Session是存储它的唯一可能的地方。

另一方面,您完全有可能需要存储您没有告诉我们的内容,而这些内容实际上只适合会话。

因此,在您沿着这条路走得太远之前,请确保其他解决方案尚未可用于您需要存储的数据。