【问题标题】:Does a child action share the same ViewBag with its "parents" action?子操作是否与其“父”操作共享相同的 ViewBag?
【发布时间】:2011-12-05 22:22:20
【问题描述】:

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

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

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

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

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

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

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

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

【问题讨论】:

  • 请不要在您的问题前加上“[.NET MVC3]”之类的东西。在Stack Overflow 上,我们为此目的使用标签。
  • 如果您的子操作与父操作没有完全分开,您可能需要考虑 Html.Partial

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


【解决方案1】:

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

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

在子动作中:

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

【讨论】:

  • 感谢您的回答,但是如果我想通过子操作传递多个消息(参数)怎么办?再次感谢您:)
  • 不能直接发吗,比如new {message = ViewBag.Message, param2 = somethingElse}
  • 对不起,但我需要将子动作传递给流动的东西:一个 ID(int),一个消息(字符串)和一个对象(我的自定义对象),所以,我想我完全考虑使用这种方法是错误的?现在有办法同时传递一个子动作这么多东西?:)
  • 实际上我可以使用 ID 来获取子操作中的所有内容,但是对象是从数据库中获取的,所以我认为从数据库中搜索比传递给子操作更昂贵: )如果没有办法通过,我只好在child action中做数据库搜索:)
  • 使用TempData[SomeId] = whatEverInstance 怎么样 - 这不是在 MVC 中做这些事情的正确方法吗?
【解决方案2】:

有一种方法,但您必须创建一个自定义抽象类作为剃刀视图的基类。然后将您需要的任何内容从父操作公开到子操作。 这就是我如何在从 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;
    }

【讨论】:

  • 在我的孩子行动中,我只是打电话给ViewBag.Variable = ControllerContext.ParentActionViewContext.ViewBag.Variable。可能有一种方法可以循环并复制所有变量,但我只需要一个。感谢您的起点。
  • 如果您想循环播放,请尝试将您的 viewbag 转换为 Dictionary
猜你喜欢
  • 1970-01-01
  • 2018-04-06
  • 1970-01-01
  • 2011-08-10
  • 2012-05-18
  • 2015-01-11
  • 2021-10-23
  • 2017-10-03
  • 1970-01-01
相关资源
最近更新 更多