Совместно ли у дочернего действия тот же ViewBag с действием «родителей»? - PullRequest
31 голосов
/ 12 октября 2011

Я запутался с этим: У меня есть действие, скажем, Parent, и в соответствующем файле представления я назвал дочернее действие, скажем, Child, и действия Parent и Child находятся в одном контроллере.

и мне нужно действие Child и родительское действие, чтобы поделиться некоторыми данными в ViewBag. Теперь, что я должен делать? Вот мой вопрос:

когда я вызываю действие Child в родительском файле представления, я передаю ему viewbag следующим образом: @ Html.Action (ViewBag). в своем детском действии я делаю это:

public PartialViewResult Child(Object ViewBag)
{
  //using the data in ViewBag
}

Это правильный путь? Передается ли объект viewbag по ссылке или это другой объект, отличный от исходного viewbag (требуется больше памяти)?

Или, если по умолчанию дочернее действие совместно использует viewbag с вызывающим родительским действием?

Из ответа Дарина Димитрова я знал, что не могу сделать что-то вроде этого: @ Html.Action (ViewBag)

Но мне действительно нужно передать muti-параметры дочернего действия, что я могу сделать?

Ответы [ 2 ]

39 голосов
/ 12 октября 2011

Дочерние действия следуют другому жизненному циклу контроллера / модели / представления, чем родительские действия.В результате они не разделяют ViewData / ViewBag.Если вы хотите передать параметры дочернему действию от родителя, вы можете сделать это:

@Html.Action("Child", new { message = ViewBag.Message })

и в дочернем действии:

public ActionResult Child(string message)
{
    ...
}
14 голосов
/ 01 ноября 2012

Есть способ, но вы должны создать собственный абстрактный класс в качестве базового класса для ваших видов бритвы.Затем предоставьте все, что вам нужно, от родительских до дочерних действий.Вот так я получаю 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;
    }
...