目前我在我的ASP.NET MVC应用程序中使用ViewData或TempData作为对象持久性 .
但是在我通过我的基本控制器类将对象存储到ViewData的少数情况下,我在每次请求时都会访问数据库(当ViewData [“whatever”] == null时) .
将这些持续存在于具有更长寿命的事物(即会话)中会很好 . 类似地,在订单处理管道中,我不希望在创建时将Order之类的东西保存到数据库中 . 我宁愿在内存中填充对象,然后当订单达到某个状态时,保存它 .
那么 Session 似乎是最好的地方吗?或者你会建议在订单的情况下,从每个请求的数据库中检索订单,而不是使用会话?
思想,建议表示赞赏 . 谢谢本
3 回答
您可以序列化要保留的内容,并将其放在WebForms中的隐藏输入字段(如ViewState)中 .
这篇文章应该可以帮助您入门:http://weblogs.asp.net/shijuvarghese/archive/2010/03/06/persisting-model-state-in-asp-net-mvc-using-html-serialize.aspx
只是想我会分享我在我的应用程序中使用session的方式 . 我非常喜欢使用session的这个实现(Suggestions for Accessing ASP.NET MVC Session[] Data in Controllers and Extension Methods?),因为它可以很容易地将会话替换为另一个商店或用于测试目的 .
看一下它的实现,它让我想起了我在其他项目中使用的ObjectStore,它将对象序列化为二进制或xml,并存储在数据库或文件系统中 .
因此,我简化了我的界面(以前T必须是一个类),并提出以下内容:
我的会话商店实施:
然后我在我的基本控制器的构造函数中接受一个IObjectStore,然后可以像这样使用它来向我的其他控制器公开属性:
我很满意这种方法 .
我相信这就是Session的目的 - 临时存储会话特定数据 .
但是,由于与使用Session相关的复杂性增加,即使可以忽略不计 - 在我自己的ASP.NET MVC项目中,我已决定在每个Order创建步骤页面上访问数据库(仅在步骤之间传递ID) . 我准备优化并开始使用会话,因为我将看到每个请求的额外数据库命中是一个性能瓶颈 .