【问题标题】:Passing Complex Object correctly without using TempData / ViewBag / ViewData在不使用 TempData / ViewBag / ViewData 的情况下正确传递复杂对象
【发布时间】:2016-01-05 07:30:03
【问题描述】:

对于网站,请考虑以下场景:

  1. 用户输入数据,包括 ID,然后提交
  2. 相关的控制器将处理该请求。此时,将创建一个复杂对象(通过调用 Web 服务,使用 ID)进行一系列操作。例如验证等
  3. 向用户返回特定视图
  4. 用户输入另一组数据并提交
  5. 另一个控制器将处理这个请求。它需要第 2 步中使用的复杂对象。

等等……

目前,在第 5 步中,我将使用 ID 再次调用 Web 服务以获取所需的复杂对象。

是否有任何正确/有效的方法,而不使用 TempData/ViewBag/ViewData,以便我可以在第 2 步创建复杂对象后重用它?

编辑: 会话也不允许。

【问题讨论】:

  • 通过使用会话。
  • 不清楚为什么您的对象是由 Web 服务创建的,而不仅仅是在步骤 2 中使用模型绑定。您能否发布您的相关操作方法?
  • 为什么不为此创建视图模型并使用会话?
  • 存储在数据库中,并在需要时重新检索。
  • 你要存储服务器端还是客户端?

标签: c# asp.net-mvc razor


【解决方案1】:

通常,对于web application,有多个选项可以根据您的需要存储复杂对象。我认为没有最佳方式,只有最合适的方式,每个解决方案都会有优缺点


服务器端

  • Session我知道你说过不能使用 session,但我还是想包含它):想到第一个选项,适用于大多数网络应用程序。由于现代 Web 开发更多地基于 STATELESS,因此很多人希望不惜一切代价避免使用 Session。但是,有一些特定的基础架构配置可以支持 STATELESS 应用程序中的会话,例如 distributed sessionsticky session 或者您可以保存dedicated serverdatabase 中的会话。

    • 优点:易于使用,自然支持网络应用
    • 缺点:需要配置很多东西才能使用 STATELESS 应用程序
  • 另一个专用服务器在有人问之前,我把它放在服务器端部分,即使它是另一个服务器,但对我来说,我们控制的任何东西都是服务器端 ):这里有几个选项供您选择,第一个选项可能是设置缓存服务器(Redis?)并使用密钥检索/保存(类似于会话),或者您可以简单地编写一个应用程序来使用您的检索/保存自己的逻辑。

    • 优点:可重用性、可扩展性、适用于所有应用程序,而不仅仅是 Web,有自己的范围
    • 缺点:设置困难
  • 数据库:不是一个显而易见的选择,但数据库确实支持这种要求

    • 优点:可重用性、可扩展性、适用于所有应用程序,而不仅仅是网络
    • 缺点:性能问题
  • 其他内存选项(TempData、ViewBag 等)

    • 优点:易于使用,得到 ASP.NET MVC 的良好支持
    • 缺点:有时很难传递多个视图

客户端

  • 这里有很多选项可供选择,例如使用 隐藏字段cookielocalStoragesessionStorage、等等,甚至一个简单的查询字符串都可以工作
  • 优点:速度(因为您不需要客户端-服务器传输)
  • 缺点:安全性(您不能信任来自客户端的任何东西)、不能很好地处理过于复杂的对象(重对象)、安全性(敏感数据)等

建议的解决方案

我希望我能正确理解您的问题,但在我看来,您不应该存储复杂对象,只需将复杂对象的 ID 存储在您选择的位置,并且每次您都进行查询需要对象。这样您的对象始终是最新的,并且您不会浪费资源来存储复杂的对象。

希望对你有帮助。

【讨论】:

  • 虽然没有完全解决我的问题,但利弊都是建设性的。谢谢。
【解决方案2】:

如果您想将对象投影到某个视图,然后忘记任何存储(TempData/ViewBag/ViewData/Session),然后将相同的对象发布到另一个控制器,您可以重新构建对象的最佳方法是将对象的属性存储为隐藏的<input> 控件。

【讨论】:

  • 为什么这是“最好的”方式?然后,您必须使所有链接都执行 POST,并且您不能信任用户输入。
  • 当然这只是一般的想法,你也应该加密和签名 - 这样用户将无法以纯文本查看它,他们将无法查看在响应中伪造不同的值。
  • 这不在你的答案中,这使它变得更加复杂。
猜你喜欢
  • 2011-12-21
  • 2012-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多