2011-10-12 70 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