2011-10-12 68 views
24

我对此感到困惑: 我有一个动作,说Parent,并且在相应的视图文件中,我调用了一个子动作,比如Child,Parent和Child动作都在同一个控制器中。 ?儿童动作是否与其“父母”动作共享相同的ViewBag?

,我需要的儿童的行动和家长行动分享在ViewBag.Now一些数据,我应该做的这是我的问题:

当我打电话在父母的视图文件儿童的行动,我像这样传递视图包: @ Html.Action(ViewBag)。 在我的孩子的动作,我这样做:

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

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

或者如果Child action默认共享带有其调用父Action的viewbag?

从达林季米特洛夫的回答,我知道,我不能做这样的事情:@ Html.Action(ViewBag)

但我真的需要通过子操作穆蒂参数,我该怎么办?

+3

请继承里面不要前缀您的问题与喜欢的东西“[.NET MVC3]”。在[so]上,我们使用标签来达到这个目的。 –

+0

如果您的子操作与父代不完全分离,您可能需要考虑Html.Partial – Bochu

回答

31

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

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

,并在孩子的行动:

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

感谢您的回答,但是如果我想将多个消息(参数)传递给子操作,该怎么办?再次感谢您:) – NextStep

+1

难道你不能只发送它,例如,'new {message = ViewBag.Message,param2 = somethingElse}'? –

+0

对不起,但我需要传递子动作流动的东西:一个ID(int),一个消息(字符串)和一个对象(我的自定义对象),所以,我想我完全错误的想法使用这种方法?现在有办法在同一时间传递一个儿童动作很多东西吗?:) – NextStep

12

有一个办法,但你必须创建一个自定义抽象类作为剃刀视图的基类。然后将你需要的任何东西从父母行为暴露出来。 这是我如何获得root控制器的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; 
    } 
+1

在我的子动作中,我只是调用'ViewBag.Variable = ControllerContext .ParentActionViewContext.ViewBag.Variable'。可能有一种方法可以循环并获取所有的变量,但我只需要一个。感谢您的出发点。 – bradlis7

+0

如果你想循环,试着将你的viewbag转换成Dictionary 。 – mitsbits