ViewBag 和 ViewData 是否也是 ASP.NET MVC 中状态管理的一部分?

5
请问,ViewDataViewBag是否也属于ASP.NET MVC状态管理的一部分? 谢谢。
3个回答

11

ViewBagViewData 并不存储状态,但它们可以传递状态到视图中进行呈现和存储。

ViewBagViewData 是什么?

ViewBagViewData 不是状态持久化机制,但我认为它们是状态管理的一部分:它们是将数据传递给页面的机制,然后可以在生成的 html 中作为状态进行持久化。这样,它们是状态生命周期的一部分,因为它们允许您使用像 @Html.HiddenFor@Html.ActionLink 这样的帮助程序将状态存储在客户端 html 中。

在我的回答中 "storing a js value from 1 ActionResult to use in another ActionResult" 中,我谈到了如何使用 ViewBagViewData 在客户端 html 中存储状态以及状态存储的各种选项。

关于ViewBag是什么,它实际上是一种动态访问ViewData的方式,因此ViewBag.MyItem = "foo";var valueEqualsFoo = ViewData["MyItem"];将设置并返回相同的字符串,可以互换使用。

它们与什么类似?

ViewBagViewData与视图模型(View Model)最为相关。在操作(Action)中,将模型传递给视图(View)使用return View(viewModel);:这三种技术都将状态从内存传递到HTML中,在发送到客户端、任何中间缓存以及远离服务器的位置进行“持久化”。
以类似的方式,当在HTTP请求中向服务器发送带有查询字符串的URL时,它是传递状态的一种方法,而实际的状态存储是HTML中的...锚。Restful URL和POST ajax请求的主体在定义和行为上是相同的。ViewBag/Data将状态从操作传递到HTML,然后传递给客户端并存储,查询字符串或restful url然后将状态传递回服务器以在下一个操作调用中使用。
何时应该使用它们?
在 Razor 代码中拼写错误很难检查动态属性;如果在强类型的视图模型上检查该属性是否存在则更加容易。因此,我认为你应该尽量避免使用它们。我认为最好创建强类型的视图模型,而不是使用 ViewBagViewData。对于 一个快速且简单的解决方案,它们可能还不错,但那些东西往往会产生技术债务ViewBag 可能适用于设置页面标题。 强类型视图模型:
  • 使映射到像 自动映射器 这样的框架更容易;
  • 使视图更易于测试;并且
  • 使得对于传递相同模型到每个视图的不同设备易于创建不同的视图

状态存储的选项有哪些?

我曾经在这里说过,现在我再次强调:以前至少有ASP.NET中用于管理持久用户状态的9种选项,其中许多仍适用于MVC。根据状态应如何使用,它们都具有不同的用途。通常情况下,尽可能无状态的服务器端代码更容易进行测试和调试。

客户端存储包括:
  • 在html结果中传递的实体,并转换为:
    • 输入字段
    • 隐藏字段
    • 用于ajax请求POST主体的Javascript变量
    • 查询字符串值和URL路径(例如Restful URL,如/Product/1
  • 旧版ASP.NET技术,将状态保留在隐藏的html字段中,例如ViewState
  • Cookies
  • Html5技术,例如本地存储
  • 生成的防伪令牌 以防止XSRF
  • 服务器端存储(与ASP.NET和ASP.NET MVC直接相关):
  • 服务器端存储(其他):
    • 数据库,无论是SQL还是NOSQL
    • 文件存储
    • 消息队列,例如WASB

  • 注脚:

    我们现在拥有易于使用的响应式设计工具,我们可以在适当的时候使用,但并不总是合适:一些视图需要在移动设备上完全不同,但仍然使用相同的视图模型作为大屏幕站点。


    1

    0

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接