hat*_*enn 33 c# asp.net-mvc dynamic viewbag
我正在阅读一本关于ASP.NET MVC的书,我想知道以下示例是如何工作的:
public class MyController : Controller
{
public ActionResult Index()
{
ViewBag.MyProperty = 5;
return View();
}
}
Run Code Online (Sandbox Code Playgroud)
<h1>@ViewBag.MyProperty</h1>
Run Code Online (Sandbox Code Playgroud)
现在我明白了ViewBag是一个动态的对象,所以这是如何设置的属性(虽然我不知道很多关于动态对象,从来没有与他们合作.)但如何看法得到的特定实例ViewBag从控制器,即使我们没有直接传递任何东西?
我认为它ViewBag可能是一个public static对象,但是对它的任何改变都是全局的,它不会特定于视图实例.
你能详细说明这是如何在幕后工作的吗?
public class MyController : Controller
{
public ActionResult Index()
{
ViewBag.MyProperty = 5;
return View();
}
public ActionResult Index2()
{
ViewBag.MyProperty = 6;
return View();
}
}
Run Code Online (Sandbox Code Playgroud)
现在让我们说Index首先调用该方法,然后调用Index2.最后,值ViewBag.MyProperty将最终为6(来自的值Index2).我觉得这不是一件好事,但与此同时我觉得我在思考桌面开发术语.也许与ASP.NET MVC一起使用无关紧要,因为Web是无状态的.是这样的吗?
And*_*lil 28
ViewBag是ControllerBase所有控制器必须继承的属性.这是一个dynamic对象,这就是为什么你可以添加新属性而不会出现编译时错误的原因.
它不是static,它是对象的成员.在请求生命周期中,创建并处理控制器实例,因此您不会遇到"并发"问题,例如覆盖该值.
的View(及其变体)的方法没有static为好,这是怎么视图接收的ViewBag值:呈现视图的过程中,控制器实例都有ViewBag实例为好.
Ram*_*nas 11
如果您要分析ControllerBase类,您会看到ViewBag属性是ViewData属性的"代理",只是为了使您的源看起来更好.(我甚至还记得Scott Hanselman接受Phil Haack的采访,其中Phil引入了ViewBag属性作为ViewData的快捷方式,并且不需要重复的方括号和引号).即使ViewBag属性作为dynamic对象公开,它也实现了一个直接与ViewData一起工作的DynamicViewDataDictionary类.
查看Controller类的源代码,您可以找到以下方法:
protected internal virtual ViewResult View(string viewName, string masterName, object model)
Run Code Online (Sandbox Code Playgroud)
所以基本上当你return View();从你的控制器调用时,它创建了一个新的ActionResult类实例,它将ViewData从控制器传递给它的构造函数.ActionResult然后将实例传递给特定的视图引擎(ASPX,Razor),以便它可以用于渲染有问题的视图.
使ViewBag/ViewData公共静态可能是有害的.对MVC应用程序的每个Web请求都会创建一个新的控制器实例.如果您将ViewData/ViewBag作为公共静态,则两个并发用户将共享ViewBag/ViewData中的相同数据.
这是一个视频.关于ViewBag(formder ViewModel)的讨论从04:05开始
ViewBag是的财产ControllerBase.它的定义如下:
public Object ViewBag { get; }
Run Code Online (Sandbox Code Playgroud)
请注意,此签名实际上是不正确的.以下是源代码的实际内容:
public dynamic ViewBag {
get {
if (_dynamicViewDataDictionary == null) {
_dynamicViewDataDictionary = new DynamicViewDataDictionary(() => ViewData);
}
return _dynamicViewDataDictionary;
}
}
Run Code Online (Sandbox Code Playgroud)
_dynamicViewDataDictionary是一个ExpandoObject; 您可以在运行时向其添加属性.它的生命周期与控制器的生命周期相同,后者是HTTP请求的生命周期.
| 归档时间: |
|
| 查看次数: |
43835 次 |
| 最近记录: |