ViewBag和ViewData也是asp.net mvc中状态管理的一部分吗?

Jit*_*mar 5 asp.net-mvc state-management asp.net-mvc-3

有人可以告诉我,ViewDataViewBag是否也是asp.net mvc状态管理的一部分?谢谢

And*_*own 11

ViewBag并且ViewData不存储状态,但是它们可以将它传递给要呈现和存储的视图.

什么是ViewBagViewData

ViewBag并且ViewData不是状态持久性机制,但我相信它们是状态管理的一部分:它们是将数据传递到页面的机制,然后可以在生成的html中将其作为状态持久化.通过这种方式,它们是状态生命周期的一部分,因为它们允许您使用诸如@Html.HiddenFor或之类的帮助程序在客户端html中存储状态@Html.ActionLink.

在我的回答"存储来自1个ActionResult的js值以在另一个ActionResult中使用"中,我讨论了如何ViewBag以及ViewData可以用于在客户端html中存储状态,以及状态存储的各种选项是什么.

至于什么ViewBag是,它实际上是一个dynamic访问的方式ViewData,所以ViewBag.MyItem = "foo";var valueEqualsFoo = ViewData["MyItem"];将设置并返回相同的字符串,可以互换.

它们有什么相似之处?

ViewBag,ViewData与Action中的View Model最紧密相连,其中模型使用以下内容传递给Action内部的View return View(viewModel);:所有三种技术都将内存中的状态传递给html,将其发送到客户端,发送到任何中间缓存,并且"坚持"远离您的服务器.

以类似的方式,当URL中的查询字符串被发送到http请求中的服务器时,它是传递状态的方法,实际的状态存储<a href="urlwithquerystring">...</a>html中的锚.Rest ajax请求的Restful URL和主体在其定义和行为方面是相同的.ViewBag/Data将状态从Action传递给html,传递给客户端并存储,查询字符串或restful url然后将状态传递回服务器以用于下一个Action调用.

我应该什么时候使用它们?

您的Razor代码中的拼写错误很难检查动态属性; 很容易检查强类型视图模型上是否存在属性.所以我相信你应该很少使用它们.在我看来,最好是创建强类型视图模型而不是使用ViewBagViewData.它们可能适用于快速而肮脏的解决方案,但这些事情往往会产生技术债务.ViewBag有可能用于设置页面标题确定.

强类型视图模型:

  • 使用像automapper这样的框架更容易使用映射;
  • 使观点更可测试; 和
  • 为同一模型传递到每个视图的不同设备创建不同视图更容易

我对状态存储的选择是什么?

在这里,我再说一遍:在ASP.NET中至少有九个用于管理持久用户状态的选项,其中许多仍然适用于MVC.根据应该如何使用状态,它们都有不同的用途.通常,尽可能无状态的服务器端代码更易于测试和调试.

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

脚注:

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