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



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

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

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

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

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

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

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

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

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

最新更新