ViewData
属性的类型为IDictionary<string, object>
,在ControllerBase
内部声明,因此是每个请求的对象。
并且子操作不是单独的HTTP请求。
因此,理想情况下,在我上面假设的设计下,父母和孩子的行为应该共享相同的ViewData
。
然而,情况似乎并非如此。
那么,这是如何实现的呢?子操作如何能够拥有自己的ViewData
?为子操作创建单独ViewDataDictionary
实例的代码在哪里?
子操作有自己的ViewData
,因为它有自己的生命周期。
当向主方法发出请求时,它的控制器被初始化,操作初始化它的ViewData
并开始呈现它的视图。当遇到@Html.Action()
时,控制器的新实例被初始化,并且子动作初始化其ViewData
并呈现其插入在@Html.Action()
指定的占位符处的视图(然后子动作控制器及其ViewData
被释放),并且主视图继续呈现标记。
您可以通过为控制器创建一个无参数构造函数来测试这一点,并查看它是否为每个子操作初始化。
所有这些都发生在一个HTTP请求中。