子动作是否与其“父母”动作共享相同的ViewBag?

时间:2011-10-12 08:20:41

标签: asp.net-mvc-3 viewbag child-actions

我对此感到困惑: 我有一个动作,比如Parent,在相应的视图文件中,我调用了一个子动作,比如Child,父动作和子动作都在同一个控制器中。

我需要Child动作和Parent动作来共享ViewBag.Now中的一些数据,我应该怎么做?这是我的问题:

当我在父视图文件中调用Child动作时,我将viewbag传递给它: @ Html.Action(ViewBag)。 在我的孩子行动中,我这样做:

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

这是正确的方法吗? viewbag对象是通过引用传递的还是与原始viewbag不同的对象(需要更多内存)?

或者,如果Child动作在默认情况下与其调用父Action共享Viewbag?

从Darin Dimitrov的回答中,我知道我不能做这样的事情:@ Html.Action(ViewBag)

但我真的需要传递子动作多参数,我该怎么办?

2 个答案:

答案 0 :(得分:39)

子操作遵循与父操作不同的控制器/模型/视图生命周期。因此,他们不共享ViewData / ViewBag。如果要将参数传递给父项的子操作,可以执行以下操作:

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

并在儿童行动中:

public ActionResult Child(string message)
{
    ...
}

答案 1 :(得分:14)

有一种方法,但您必须创建一个自定义抽象类作为剃刀视图的基类。然后将您需要的任何内容从父动作暴露给子动作。 这是我从继承自WebViewPage

的类中获取根控制器的ViewBag的方法
    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;
    }