有人可以告诉我ViewData和ViewBag是否也是asp.net mvc 状态管理的一部分吗?谢谢
3 回答
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 代码中拼写错误的动态属性;很容易检查强类型视图模型上是否存在属性。因此我相信你应该很少使用它们。在我看来,最好创建强类型视图模型而不是使用ViewBag
or ViewData
。它们可能适合快速而肮脏的解决方案,但这些东西往往会产生技术债务。ViewBag
设置页面标题可能没问题。
强类型视图模型:
- 使用automapper等框架更容易使用映射;
- 使视图更具可测试性;和
- 更容易为不同的设备创建不同的视图,您将相同的模型传递给每个视图†</sup>
我有哪些状态存储选项?
我在这里说了,我再说一遍:过去在 ASP.NET 中管理持久用户状态至少有九个选项,其中许多仍然适用于 MVC。根据应如何使用状态,它们都有不同的用途。通常,尽可能无状态的服务器端代码更容易测试和调试。
- 客户端存储包括:
- 服务器端存储(与 ASP.NET 和 ASP.NET MVC 直接相关):
- 会话(可通过控制器的
Session
属性获得 - 缓存 (通过控制器的
Cache
属性可用) - 临时数据
- HttpContext["项目键"]
- 应用程序(可通过 Controller 的
HttpContext
属性 as 获得HttpContext.Application
) - Web.config 和 Machine.config 文件(是的,它们也保存状态,它只是应用程序范围的)和
WebConfigurationManager.AppSettings
字典。
- 会话(可通过控制器的
- 服务器端存储(其他):
- 数据库,无论是 SQL 还是 NOSQL
- 文件存储
- 消息队列,例如 WASB
脚注:
†</sup>我们现在有易于使用的响应式设计工具,我们可以在 适当的时候使用,但它并不总是合适的:一些视图需要在移动设备上看起来完全不同,但仍使用与大屏幕站点相同的视图模型。
两者都不是!
状态管理有 2 种类型 1:客户端,2:服务器端
客户端
- 隐藏场
- 查看状态
- 饼干
- 控制状态 - 查询字符串
服务器端
- 会议
- 应用
如果你想区分这些,请看这里 ViewData 和 ViewBag 有什么区别?
在 View Data、View Bag 和 Temp 数据中,我们会将数据从控制器传送到视图,因此它是 MVC 中状态管理的一部分。状态管理装置保存控制器和网页以及对象和数据的状态。
这可以通过以下方式完成:客户端状态管理服务器端状态管理。
简要了解https://www.codeproject.com/Articles/492397/State-Management-in-ASP-NET-Introduction。