子操作如何能够拥有自己的ViewDataDictionary实例?

时间:2015-02-20 05:45:26

标签: asp.net-mvc

ViewData属性的类型为IDictionary<string, object>,并在ControllerBase内声明,因此是每个请求对象。

子操作不是单独的HTTP请求。

因此,理想情况下,根据我上面假设的设计,父母和子女的行为应该共享相同的ViewData

然而,情况似乎并非如此。

那么,这是如何实现的?子操作如何能够拥有自己的ViewData,以及为子操作创建单独的ViewDataDictionary实例的代码在哪里?

1 个答案:

答案 0 :(得分:1)

子操作有自己的ViewData,因为它有自己的生命周期。

当对main方法发出请求时,其控制器被初始化并且操作初始化其ViewData并开始呈现其视图。遇到@Html.Action()时,初始化控制器的新实例,子操作初始化其ViewData并呈现其视图,该视图插入@Html.Action()指定的占位符(子操作控制器)然后处理它的ViewData并且主视图继续呈现标记。

您可以通过为控制器创建无参数构造函数来测试它,并查看它是否已针对每个子操作进行初始化。

所有这些都发生在一个HTTP请求中。