Asp.Net MVC和Session

20

我想在ASP.NET MVC应用程序中以不同步骤构建对象,每个步骤都是一个不同的页面。这种事情你可以在Web.Forms应用程序中使用Session存储。

我看了一些文献,似乎Session并不是很适合ASP.NET MVC。但是我真的想不到其他替代方案,因为TempData和ViewData似乎也不适用,所以也许我错了。

当然,我可以将4个步骤放在一个页面中并显示/隐藏,但这并不是我的问题。我想听听您对MVC中Session的看法,如果它是解决这种多步问题的好方法,还是您倾向于以其他方式解决。

这非常类似于问题ASP.NET MVC中的会话变量,只是我不是在寻找如何访问Session,而是最好的解决方法或者我在Asp.Net MVC中漏掉了什么更好的东西。

提前致谢

3个回答

19

在MVC中,Session并没有什么不合适的地方,它是网页的重要组成部分,大多数网站都以某种方式使用它。您有两个主要选择。要么在页面之间将对象存储在数据库中(这意味着保存不完整的对象),要么将其放入会话中。两者都有优缺点。

在会话中,您不必将部分对象保存到数据库中,但如果用户离开或会话超时,则会丢失所有信息。这还可能导致每个用户的内存占用增加,并且当您扩展规模时会引起其他一些问题。(可以通过在负载均衡器上使用黏性会话或中央会话存储来解决所有这些问题)。

在数据库中的方法在许多方面都更好,但通常不希望将不完整的对象保存到数据库中,一种折衷方法是创建另一个表并将对象序列化保存到该表中。它不会经过您的实际表格,因此您不必妥协于数据库约束。(您还可以将会话数据存储在数据库中,这基本上是在做同样的事情)。

最终,这是两种方法之间的判断调用,我多年来都使用过两种方法。


我不反对你的观点,但请注意,粘性会话或中央会话状态对可扩展性来说都是坏消息。当然仍然可以进行扩展,但这会让生活变得困难。如果可以避免使用会话状态,那么你的可扩展性就会更好 - 也许这就是为什么OP对此持谨慎态度的原因? - Steve
4
你如何定义“hard”?我使用这种方法扩展了许多系统,没有遇到问题。尤其是一旦涉及用户登录等方面,完全避免使用session非常困难。 - James Avery

2
你可以使用TempData在视图之间传递数据,但必须通过后续视图保持传递。它旨在被后续请求使用,但这并不意味着你不能将临时数据传递给下一个请求,同时还将相同的数据放回到临时数据中。

1

你尝试过使用 <%= Html.HiddenField(...) %> 吗?


你是指"<input type=hidden... />"的HTML助手吗?但那只能存储简单值,我需要存储和填充一个复杂对象。 - antonioh
https://dev59.com/J0bRa4cB1Zd3GeqP5PWX#669495 - Mehrdad Afshari
谢谢,但那不是我正在寻找的。我正在寻找标准的良好实践。不过这是个好主意。 - antonioh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接