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