我正在寻找关于如何在ASP.NET MVC应用程序中使用会话的想法。特别是当使用母版页和尝试只获取数据到主页,而不绕过控制器。这个问题一开始是我问了很多小问题,但后来我设法把它塑造成一个解决方案,到目前为止我还没有实施,但这个解决办法有点可行。如果有任何反馈的话。
我提出的解决方案,也就是“我将要实现什么,除非有人说停止!”
我的模型类继承自ModelBase --它包含了主页所需的信息(每页只有一个视图),用于它在masthead或页脚中显示的某些内容,以及基于登录对象的配置驱动设置。
我的最佳解决方案如下所示-这里显示了一个“产品页面”:
假设:在某个时候,我已经将某些数据固定在会话中--例如,可能是通过网关页面进入的
partnerId,或者是currentLoggedInUserEmail属性或完全成熟的对象。 我有一个ModelBase类,每个模型(如ProductModel)都从该类继承 我有一个MySiteControllerBase类(继承自Controller),它由ProductController子类。 在ProductController中的操作方法中,我使用'new ProductModel()'为产品视图创建模型。这个模型类本身对会话或如何填充ModelBase一无所知。它根本不了解ModelBase--它只是继承了它。我的链式构造函数什么也不做(因为我不想把它传递给Session)。 对于所有带有模型参数的重载,我都在MySiteControllerBase中重写了MySiteControllerBase。我检查该参数是否为ModelBase类型,如果是,则填充属性(如partnerid和currentLoggedInuserEmail)。幸运的是,因为我在一个继承自Controller的类中,所以我可以直接访问Session,这样就可以直接将它们从那里提取出来。
这个方法意味着,只要我执行ModelBase操作,就可以自动填充'return View(model)'上的属性。但是,如果ProductModel模型需要访问ModelBase上定义的任何内容,则存在一个明显的问题。因为它还没有填充,所以它将变为空。
这个问题可以通过将Session传递给new ProductModel(session)来解决,而后者又会将构造函数链传递给new ModelBase(session)。不过,我真的不喜欢这个解决方案,因为我喜欢把模型看作一个不应该知道任何外部数据结构的非常愚蠢的数据结构。另一种解决方案可能是打开它,如果我发现ProductController需要使用ModelBase中定义的任何东西,我只需创建一个方法MySiteControllerBase.UpdateModelBase(productModel, session),在ProductController中显式地填充它。我希望这是清楚的!
想到的其他问题有:
发布于 2009-01-29 15:21:17
虽然在ASP.NET MVC应用程序中使用会话原则上没有什么问题(嗯,至少没有什么比在其他ASP.NET应用程序中使用它更错误的了……),但我倾向于认为,当其他事情不起作用时,它应该是最后的手段。
虽然你的问题一般都写得很好,但你并没有详细说明你打算在会议中存储什么。我在你的问题中发现的两个例子是:
如果您正在使用表单身份验证,用户的电子邮件地址已经可用,并且可以添加到其他已经不支持它的ASP.NET成员资格提供程序中。目前还不清楚partnerid到底是什么,但我怀疑会话是否是唯一可能存储它的地方。
另一方面,你完全有可能需要存储一些你还没有告诉我们的东西,这些东西只适合在会话中使用。
因此,在您走得太远之前,请确保您需要存储的数据还没有其他解决方案可用。
发布于 2009-01-29 04:28:24
至于单元测试,您需要一个假HttpContext对象(从HttpContextBase扩展)和一个假会话对象(从SessionStateBase扩展)。或者你可以做我们做的事,然后使用菲尔哈克斯HttpSimulator。这不是一个完美的解决方案,但是当您使用asp进行任何操作时,都会有那么多紧密耦合的对象连接在一起,因此您永远不会发现任何特别优雅的东西。我们发现我们经常碰到它,所以抓住这些类并把它们放在一个助手库中是值得的。
Cookie按域工作,因此实际上没有任何问题。您可以始终将会话配置为in,并且是没有烹饪功能的。
一般来说,对于你在会话中保留的内容要非常稀疏。但这也适用于Webforms。
https://stackoverflow.com/questions/490391
复制相似问题