5

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

4

3 回答 3

11

ViewBag并且ViewData不存储状态,但他们可以将其传递给要渲染和存储的视图。

ViewBag和是什么ViewData

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

在我对“从 1 个 ActionResult 存储 js 值以在另一个 ActionResult 中使用”的回答中,我讨论了如何ViewBag以及ViewData可以用于在客户端 html 中存储状态,以及状态存储的各种选项。

至于是什么ViewBag,其实是dynamic一种访问方式ViewData,所以ViewBag.MyItem = "foo";andvar valueEqualsFoo = ViewData["MyItem"];会设置和返回相同的字符串,可以互换。

它们有什么相似之处?

ViewBag,ViewData与 Action 中的 View Model 联系最紧密,其中模型通过以下方式传递给 Action 内部的 View return View(viewModel);:所有三种技术都将内存中的状态传递到 html 中,然后将其发送到客户端,到任何中间缓存,并“坚持”远离您的服务器。

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

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

很难检查 Razor 代码中拼写错误的动态属性;很容易检查强类型视图模型上是否存在属性。因此我相信你应该很少使用它们。在我看来,最好创建强类型视图模型而不是使用ViewBagor ViewData。它们可能适合快速而肮脏的解决方案,但这些东西往往会产生技术债务ViewBag设置页面标题可能没问题。

强类型视图模型:

  • 使用automapper等框架更容易使用映射;
  • 使视图更具可测试性;和
  • 更容易为不同的设备创建不同的视图,您将相同的模型传递给每个视图†</sup>

我有哪些状态存储选项?

我在这里说了,我再说一遍:过去在 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

脚注:

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

于 2013-06-01T19:02:59.787 回答
1

两者都不是!

状态管理有 2 种类型 1:客户端,2:服务器端

客户端

  • 隐藏场
  • 查看状态
  • 饼干
  • 控制状态 - 查询字符串

服务器端

  • 会议
  • 应用

如果你想区分这些,请看这里 ViewData 和 ViewBag 有什么区别?

以及 什么是 ViewData、ViewBag

于 2013-06-01T10:54:18.173 回答
0

在 View Data、View Bag 和 Temp 数据中,我们会将数据从控制器传送到视图,因此它是 MVC 中状态管理的一部分。状态管理装置保存控制器和网页以及对象和数据的状态。

这可以通过以下方式完成:客户端状态管理服务器端状态管理。

简要了解https://www.codeproject.com/Articles/492397/State-Management-in-ASP-NET-Introduction

于 2017-07-03T18:27:59.940 回答