32

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

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

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

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

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

或者如果默认情况下子操作与其调用父操作共享视图包?

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

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

4

2 回答 2

42

子操作遵循与父操作不同的控制器/模型/视图生命周期。因此他们不共享 ViewData/ViewBag。如果您想将参数从父操作传递给子操作,您可以这样做:

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

在子动作中:

public ActionResult Child(string message)
{
    ...
}
于 2011-10-12T08:25:24.263 回答
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;
    }
于 2012-10-31T22:52:02.137 回答