Имеет ли дочернее действие один и тот же ViewBag со своим действием "родители"?
Я смущен этим:
У меня есть действие, скажем, "Родитель", и в соответствующем файле представления я вызвал дочернее действие, например "Ребенок", и "Родительский" и "Ребенок" находятся в одном и том же контроллере.
и мне нужно действие Child и действие Parent для обмена некоторыми данными в ViewBag.Now, что я должен делать? Вот мой вопрос:
когда я вызываю действие Child в родительском файле просмотра, я передаю ему сумку просмотра следующим образом:
@Html.Action(ViewBag).
в моем дочернем действии я делаю это:
public PartialViewResult Child(Object ViewBag)
{
//using the data in ViewBag
}
Правильно ли это? Объект viewbag передается по ссылке или это другой объект, чем исходная сумка просмотра (требуется больше памяти)?
Или, если действие Child по умолчанию делит сумку представления с ее вызывающим родительским действием?
От Дарина Димитрова ответ, я знал, что не могу сделать что-то вроде этого: @Html.Action(ViewBag)
Но мне действительно нужно передать muti-параметры дочернего действия, что я могу сделать?
Ответы
Ответ 1
Действия ребенка следуют за другим жизненным циклом контроллера/модели/представления, чем родительские действия. В результате они не делят ViewData/ViewBag. Если вы хотите передать параметры дочернему действию родителя, вы можете сделать это:
@Html.Action("Child", new { message = ViewBag.Message })
и в дочернем действии:
public ActionResult Child(string message)
{
...
}
Ответ 2
Есть способ, но вам нужно создать собственный абстрактный класс в качестве базового класса для ваших бритвенных представлений. Затем выложите все, что вам нужно, от родительского к дочерним действиям.
Вот как я получаю корневой контроллер ViewBag внутри класса, наследующего от WebViewPage
private dynamic GetPageViewBag()
{
if (Html == null || Html.ViewContext == null) //this means that the page is root or parial view
{
return ViewBag;
}
ControllerBase controller = Html.ViewContext.Controller;
while (controller.ControllerContext.IsChildAction) //traverse hierachy to get root controller
{
controller = controller.ControllerContext.ParentActionViewContext.Controller;
}
return controller.ViewBag;
}