7

我正在寻找有关如何在 ASP.NET MVC 应用程序中使用 Session 的想法?尤其是在使用母版页并试图在不绕过控制器的情况下将数据获取到母版页时。这个问题一开始是我问了很多小问题,但后来我设法将它塑造成一个我还没有实施但有点可行的解决方案。任何反馈将不胜感激。


我提出的解决方案又名“除非有人说停止,否则我将要实施的方案!”

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

我最好的解决方案如下 - 此处显示“产品页面”:

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

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

我有一个MySiteControllerBase类(从 Controller 继承) - 它是ProductController.

在我的操作方法中,ProductController我使用'new ProductModel()'. 这个模型类本身对会话或如何填充一无所知ModelBase。它本质上甚至不知道ModelBase——它只是继承自它。我的链式构造函数什么都不做(因为我不想传递它Session)。

我覆盖View(...)MySiteControllerBase所有采用模型参数的重载。我检查该参数是否属于类型ModelBase,如果是,我填充属性,例如partneridcurrentLoggedInuserEmail。幸运的是,因为我在一个继承自我Controller可以直接访问的类中,Session所以我可以直接将它们从那里拉出来。

此方法意味着ModelBase仅由我自动填充on 的属性'return View(model)'。但是,如果模型ProductModel需要访问ModelBase. 它将为空,因为它尚未填充。

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

想到的其他问题是:

  • 单元测试呢?MVC 中的会话状态是否有任何抽象,或者我应该自己构建?我在源代码中搜索了“会话”,但没有任何结果!
  • 会话跟踪如何与 MVC 中的 /REST/FUL/URLS 一起工作?我需要知道关于 cookie 关闭的任何问题吗?
  • 我应该以不同于我传统方式的方式来考虑会话吗?
4

2 回答 2

1

至于单元测试,您将需要一个假 HttpContext 对象(从 HttpContextBase 扩展)和一个假会话对象(从 SessionStateBase 扩展)。或者你可以做我们所做的,并使用 Phil Haacks HttpSimulator。这不是一个完美的解决方案,但是当您使用 asp 做任何事情时,有很多紧密耦合的对象会连接在一起,以至于您永远不会真正发现任何特别优雅的东西。我们发现我们经常碰到它,因此抓住这些类并将它们放在帮助库中是值得的。

Cookie 是按域工作的,所以这方面真的没有任何问题。您始终可以将会话配置为进程内且无 cookie。

一般来说,在会话中保留的内容非常稀疏。但这也适用于 Webforms。

于 2009-01-29T04:28:24.803 回答
1

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

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

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

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

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

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

于 2009-01-29T15:21:17.650 回答