【发布时间】:2013-05-28 02:52:48
【问题描述】:
谁能告诉我 ViewData 和 ViewBag 是否也是 asp.net mvc 状态管理 的一部分? 谢谢
【问题讨论】:
标签: asp.net-mvc asp.net-mvc-3 state-management
谁能告诉我 ViewData 和 ViewBag 是否也是 asp.net mvc 状态管理 的一部分? 谢谢
【问题讨论】:
标签: asp.net-mvc asp.net-mvc-3 state-management
ViewBag 和 ViewData 不存储状态,但它们可以将其传递给视图进行渲染和存储。
ViewBag 和ViewData?ViewBag 和 ViewData 不是状态 persistence 机制,但我相信它们是状态管理的一部分:它们是将数据传递到页面的机制,然后可以将其作为状态保留在生成的html。通过这种方式,它们是状态生命周期的一部分,因为它们允许您使用 @Html.HiddenFor 或 @Html.ActionLink 等帮助程序将状态存储在客户端 html 中。
在我对"storing a js value from 1 ActionResult to use in another ActionResult" 的回答中,我谈到了如何使用ViewBag 和ViewData 在客户端html 中存储状态,以及状态存储的各种选项是什么。
至于ViewBag是什么,其实是dynamic访问ViewData的方式,所以ViewBag.MyItem = "foo";和var valueEqualsFoo = ViewData["MyItem"];会设置和返回相同的字符串,可以互换。
ViewBag、ViewData 与 Action 中的 View Model 连接最密切,其中使用 return View(viewModel); 将模型传递给 Action 内部的 View:这三种技术都将内存中的状态传递到 html 中它被发送到客户端、任何中间缓存,并从您的服务器“持久化”。
以类似的方式,当 url 中的查询字符串在 http 请求中发送到服务器时,它是一种传递状态的方法,实际状态存储是 html 中的 <a href="urlwithquerystring">...</a> 锚点。 Restful URL 和 POST ajax 请求的主体在定义和行为上是相同的。 ViewBag/Data 将状态从 Action 传递到 html,然后传递给客户端并存储,查询字符串或 restful url 然后将状态传递回服务器以用于下一次 Action 调用。
很难检查 Razor 代码中拼写错误的动态属性;很容易检查强类型视图模型上是否存在属性。因此我相信你应该很少使用它们。在我看来,最好创建强类型视图模型而不是使用ViewBag 或ViewData。他们可能适合quick and dirty solution,但这些东西往往会创建Technical Debt。 ViewBag 可能可以设置页面标题。
强类型视图模型:
我说过here,我再说一遍:过去至少有Nine Options for Managing Persistent User State in ASP.NET,其中许多仍然适用于MVC。根据应如何使用状态,它们都有不同的用途。一般来说,尽可能无状态的服务器端代码更容易测试和调试。
/Product/1 等 Restful URL)ViewState
Session 属性获得Cache 属性获得)HttpContext 属性作为HttpContext.Application 获得)WebConfigurationManager.AppSettings 字典。脚注:
†我们现在有易于使用的tools for responsive design,我们可以使用whenappropriate,但它并不总是适合:一些视图need to look entirely different on mobile,但仍然使用与大屏幕站点相同的视图模型。
【讨论】:
两者都不是!
状态管理有 2 种类型 1:客户端,2:服务器端
客户端
服务器端
如果你想改变这些,请看这里 What's the difference between ViewData and ViewBag?
【讨论】:
在 View Data、View Bag 和 Temp 数据中,我们会将数据从控制器传送到视图,因此它是 MVC 中状态管理的一部分。 状态管理手段保存控制器和网页以及对象和数据的状态。
这可以通过以下方式完成: 客户端状态管理 服务器端状态管理。
简要了解https://www.codeproject.com/Articles/492397/State-Management-in-ASP-NET-Introduction。
【讨论】: