有人可以告诉我, ViewData 和 ViewBag 是否也是 asp.net mvc州管理的一部分? 感谢
答案 0 :(得分:11)
ViewBag
和ViewData
不存储状态,但可以将其传递给要呈现和存储的视图。
ViewBag
和ViewData
? ViewBag
和ViewData
不是状态持久性机制,但我相信它们是状态管理的一部分:它们是将数据传递到页面的机制,然后可以在生成的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>
锚点。 Rest ajax请求的Restful URL和主体在其定义和行为方面是相同的。 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
等其余网址)ViewState
Session
属性Cache
属性获取)HttpContext
属性HttpContext.Application
获取)WebConfigurationManager.AppSettings
字典。脚注:
† 现在我们可以使用tools for responsive design when,我们可以使用appropriate need to look entirely different on mobile,但它并不总是合适的:一些观点{ {3}}但仍然使用与大屏幕网站相同的viewmodel 。
答案 1 :(得分:1)
两者都不是!
国家管理有2种类型 1:客户端,2:服务器端
客户端
服务器端
如果你想区别这些,请看这里 What's the difference between ViewData and ViewBag?
答案 2 :(得分:0)
在View Data,View Bag和Temp数据中,我们将从控制器携带数据进行查看,因此它是MVC中状态管理的一部分。 状态管理意味着保留控制器和网页以及对象和数据的状态。
这可以通过以下方式完成: 客户端状态管理 服务器端状态管理。
简要了解https://www.codeproject.com/Articles/492397/State-Management-in-ASP-NET-Introduction。