正确的方式来拥抱" asp.net MVC的无状态

时间:2014-05-12 22:43:00

标签: asp.net asp.net-mvc-2 state

我正在努力更新使用ASP.NET MVC2构建的移动网站,以模仿使用传统ASP.NET表单构建的非移动网站的某些功能。这是我第一次在MVC工作。在我询问如何克服ViewState的丢失之前,我已经阅读了几个,我得到了MVC的概念以及为什么它是无状态的,但是我不确定如何管理需要有状态的实例。原始网站。

例如,我有一个视图,需要调用Web服务来加载一组付款计划。付款计划被加载并显示给用户。当用户选择付款计划时,表单将发布,我需要根据所选付款计划的属性以及可能的其他付款计划的属性进行一些计算。但是,当然,它们已不复存在。我看到的选项和问题:

  • 调用网络服务以再次检索付款计划
    • 问题1 :这效率较低。与支付计划仅存储在ViewState中相比,它在服务器上的负载更多。支付计划的计算是冗长的,并且对它们进行去除与完全重新计算它们在速度方面是理想的。
    • 问题2 :自生成呈现给用户的付款计划以来,服务器状态可能已更改。调用相同的方法再次生成它们可能会产生不同的结果,但应该尊重呈现给用户的付款计划。
  • 将付款方案存储在隐藏字段中。
    • 问题1 :这将允许我在表单提交后重新创建付款计划列表,非常类似于ViewState,除了ViewState采取措施(我认为哈希?)以确保它不是篡改。我无法让精通网络的用户在浏览器中将所有价格更改为0美元,然后发布表单。我想我也可以做一个哈希,但我得到的印象是这不是MVC要采用的方法。
  • 将付款方案存储在会话状态
    • 我可以......我们已经依赖于Session,并且已经需要实现基于SQL的会话以允许可伸缩性。但是有一个需要Session状态的视图和动作似乎是错误的,并且似乎没有遵循我在这个主题上发现的建议:拥抱Web,HTTP和MVC的无状态特性。

我根本不喜欢ViewState或传统的ASP.NET,到目前为止真的很喜欢MVC,但我还不确定如何处理这类事情。提前谢谢。

为了避免我的问题被解释为广泛,问题是:当状态是必要的,因为它似乎在这里,你如何用MVC2存储它?

1 个答案:

答案 0 :(得分:1)

我发现使用Session状态或类似Application状态或Cache等更全局的问题并不存在问题。您所做的只是从服务中缓存一个值。这是“可选状态”。即使您未在Cache中找到要保存的值,您的代码仍然有效。

当他们说“无国籍”时,这不是他们的意思。例如,它们意味着控制器方法的行为不应该依赖于之前对控制器方法的调用。控制器需要操作的所有内容都应该在每次请求时传递给它,可能是ViewBag

BTW,在ASP.NET MVC之前,网络是“无状态的”。只是Web表单允许您编写代码,其行为就像控件具有状态一样,当它们确实没有时。