Подтвердить что ты не робот

Имеет ли дочернее действие один и тот же 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-параметры дочернего действия, что я могу сделать?

4b9b3361

Ответ 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;
    }