【问题标题】:Correct way to "embrace" statelessness of asp.net MVC“拥抱” asp.net MVC 无状态的正确方法
【发布时间】: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。它的意思是保存ViewState,即控件。 Session 更适合此目的。
  • 这个问题可能因为太宽泛而被关闭,你一次问的东西太多了,也许每个问题一个问题会更好?但无论如何,对于您的第二个问题 #1 - 您需要在用户提交时查找价格服务器端,不要相信用户输入。
  • 好吧,ViewState 的使用可能是一个混蛋,但从根本上说,我看到的在客户端存储数据的好处是 UI 不能超过它的数据。无论会话是否超时,它需要处理的所有内容都已发布。当然,缺点是它使响应和请求膨胀。 @JK 谢谢,我更新以突出显示特定问题。关于不信任用户输入,这就是我将其列为问题的原因。我需要原始价格,因为它在第一次计算后可能已经改变,所以我不能假设我可以在提交时再次查看它。
  • @JohnSaunders 另外,数据不可能超出视图 E.G.如果放置在 Session 中的值没有被删除。

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


【解决方案1】:

我认为使用Session state 或像Application state 或Cache 这样更全局的东西没有问题。您所做的只是从服务中缓存一个值。这是“可选状态”。即使您没有找到保存在 Cache 中的值,您的代码仍然可以工作。

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

顺便说一句,在 ASP.NET MVC 之前,Web 是“无状态的”。只是 Web 表单允许您编写代码,其行为就像控件具有状态一样,而实际上它们并没有。

【讨论】:

  • 好吧,也许我的概念太过分了。 “这是‘可选状态’。即使你没有找到值,你的代码仍然可以工作......”如果我使用‘会话’状态,你是说我需要编写代码来再次检索付款计划如果在“会话”中找不到它们?否则我的控制器依赖于我在上一个请求中存储在“会话”中的值,这是不可以的,对吧?
  • 没错。您永远不能依赖 Session 中的值。会话可能已过期。会话状态到期不一定与登录凭据的到期相对应。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-07
相关资源
最近更新 更多