【发布时间】:2013-06-05 20:40:25
【问题描述】:
我正在阅读一本关于 ASP.NET MVC 的书,我想知道以下示例是如何工作的:
示例 #1
控制器
public class MyController : Controller
{
public ActionResult Index()
{
ViewBag.MyProperty = 5;
return View();
}
}
查看
<h1>@ViewBag.MyProperty</h1>
现在我知道ViewBag 是一个动态对象,所以你可以这样设置属性(虽然我对动态对象了解不多,从未使用过它们。)但是视图如何获取特定实例来自控制器的ViewBag,即使我们没有直接传递任何东西?
我认为ViewBag 可能是一个public static 对象,但是对它的任何更改都将是全局的,并且不会特定于视图实例。
您能否详细说明这是如何在幕后工作的?
示例 #2
控制器
public class MyController : Controller
{
public ActionResult Index()
{
ViewBag.MyProperty = 5;
return View();
}
public ActionResult Index2()
{
ViewBag.MyProperty = 6;
return View();
}
}
现在假设首先调用Index 方法,然后调用Index2。最后,ViewBag.MyProperty 的值最终会变为 6(来自Index2 的值)。我觉得这不是一件好事,但同时我觉得我在考虑桌面开发方面的问题。与 ASP.NET MVC 一起使用时可能无关紧要,因为 Web 是无状态的。 是这样吗?
【问题讨论】:
-
我想
ViewBag对象只是用控制器对象作为实例属性(不是static)来实例化。 -
可以看到其实是控制器的成员:msdn.microsoft.com/en-us/library/…
-
那么如果有两个方法返回不同的视图在
ViewBag实例上设置相同的属性,它会相互影响吗?这不会造成问题吗?我觉得我仍然在考虑桌面开发。 -
控制器在
Index()被调用时被实例化,在return View();被执行后被释放。因此,一旦整个请求完成,ViewBag就会超出范围。这就是为什么ViewBag属性不会在请求之间持续存在的原因。 -
@RobertHarvey,好吧。现在说得通了。我不知道什么时候实例化了什么。正如我所说,仍然以桌面开发方式思考。你能把这些写成答案吗,我会选择它作为接受的答案。
标签: c# asp.net-mvc dynamic viewbag