【发布时间】:2014-05-13 07:08:44
【问题描述】:
我正在更新使用 ASP.NET MVC2 构建的移动网站,以模仿使用传统 ASP.NET 表单构建的非移动网站的某些功能。这是我第一次在 MVC 中工作。在我之前读过几篇关于如何克服 ViewState 丢失的问题,我了解了 MVC 以及为什么它是无状态的,但我不确定如何在原始站点中管理需要有状态的实例。
例如,我有一个视图需要调用 Web 服务来加载一组付款计划。支付计划被加载并显示给用户。当用户选择付款计划时,表单将发布,我需要根据所选付款计划的属性以及其他付款计划的可能属性进行一些计算。但是,当然,它们不再存在。我看到的选项和问题:
-
再次调用网络服务检索付款计划
- 问题 1:效率较低。与将付款计划简单地存储在 ViewState 中相比,它给服务器带来了更多的负载。付款计划的计算过程冗长,就速度而言,将其反序列化与完全重新计算相比是理想的。
- 问题 2:自生成呈现给用户的付款计划以来,服务器状态可能已更改。调用相同的方法再次生成它们可能会产生不同的结果,但应该遵守呈现给用户的付款计划。
-
将付款计划存储在隐藏字段中。
- 问题 1:这将允许我在表单提交后重新创建付款计划列表,与 ViewState 非常相似,只是 ViewState 采取措施(我认为是哈希?)以确保它不被篡改。我不能让精通网络的用户在他们的浏览器中将我的所有价格更改为 0 美元,然后发布表单。我想我也可以做一个哈希,但我觉得这不是 MVC 应该采用的方法。
-
将付款计划存储在 Session 状态
- 我可以...我们已经依赖于 Session 并且已经需要实现基于 SQL 的会话以实现可伸缩性。但是,拥有一个需要 Session 状态的视图和操作似乎是错误的,并且似乎没有遵循我在这个主题上找到的建议:接受 Web、HTTP 和 MVC 的无状态特性。
我根本不喜欢 ViewState 或传统的 ASP.NET,到目前为止我真的很喜欢 MVC,但我还不确定如何处理这类事情。提前致谢。
为了避免我的问题被解释为过于宽泛,问题是:当状态是必要的,就像它似乎在这里,你如何用 MVC2 存储它?
【问题讨论】:
-
您过去不应该为此使用
ViewState。它的意思是保存View的State,即控件。Session更适合此目的。 -
这个问题可能因为太宽泛而被关闭,你一次问的东西太多了,也许每个问题一个问题会更好?但无论如何,对于您的第二个问题 #1 - 您需要在用户提交时查找价格服务器端,不要相信用户输入。
-
好吧,ViewState 的使用可能是一个混蛋,但从根本上说,我看到的在客户端存储数据的好处是 UI 不能超过它的数据。无论会话是否超时,它需要处理的所有内容都已发布。当然,缺点是它使响应和请求膨胀。 @JK 谢谢,我更新以突出显示特定问题。关于不信任用户输入,这就是我将其列为问题的原因。我需要原始价格,因为它在第一次计算后可能已经改变,所以我不能假设我可以在提交时再次查看它。
-
@JohnSaunders 另外,数据不可能超出视图 E.G.如果放置在 Session 中的值没有被删除。
标签: asp.net asp.net-mvc-2 state