无需使用TempData / ViewBag / ViewData

时间:2016-01-05 07:30:03

标签: c# asp.net-mvc razor

对于网站,请考虑以下情况:

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

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

    有没有正确/有效的方法,没有使用TempData / ViewBag / ViewData,所以我可以在步骤2中重复使用复杂对象?

    编辑: 也不允许进行会话。

2 个答案:

答案 0 :(得分:1)

通常,对于web application,根据您的需要,可以有多种选项来存储复杂对象。我认为没有 BEST 的做法,只有最合适的方式,每个解决方案都会附带PROS和CONS

服务器端

  • 会话我知道你说不能使用会话,但我只是想把它包括在内):首先想到的选项,适合大多数网络应用。由于现代网络开发更多是 STATELESS ,很多人都希望不惜一切代价避免使用Session。但是,有一些特定的基础架构配置可支持 {STATELESS 应用程序中的会话,例如 distributed session sticky session 或您可以将会话保存在dedicated serverdatabase

    • PROS :易于使用,自然支持Web应用程序
    • CONS :需要配置很多可以使用STATELESS应用程序的东西
  • 另一个专用服务器在有人问之前,我把它放在SERVER SIDE部分,即使它是另一个SERVER,但对我来说,无论我们控制什么,都是SERVER SIDE < / em>):你可以在这里选择一些选项,第一个选项可能是设置缓存服务器(Redis?)和使用密钥检索/保存(类似于会话),或者你可以简单地编写一个应用程序来检索/使用自己的逻辑保存。

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

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

    • PROS :易于使用,ASP.NET MVC支持良好
    • 缺点:有时难以传递多个视图

客户端

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

建议的解决方案

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

希望它对你有所帮助。

答案 1 :(得分:0)

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