2013-07-26 48 views
1

我偶然發現了這種情況,我在MVC控制器中設置了一個viewbag變量,但無法在母版頁內讀取它,viewbag變量在母版。如何在父母母版頁中讀取子頁面viewbag變量

我懷疑這是因爲主頁是在頁面控制器調用之前呈現的,但仍然需要以某種方式向後通信。

+0

您可能需要** [ TempData的](http://stackoverflow.com/a/17199709/2015869)**。 –

+0

不使用'ViewBag'的原因是,當您到達佈局頁面時,它會從我的查看請求重定向,這意味着第二個請求。 –

回答

1

我100%的@Chase Florell同意,但回答你直接的問題,我相信你可以只使用ViewContext.Viewbag

+0

事實證明,我在一個從未命中的IF語句中設置Viewbag.x變量。在IF之外移動Viewbag.x = true可以解決問題。沒有必要使用ViewContext,因爲Viewbag.x就足夠了。 – user1615362

+0

在部分視圖中,我相信你必須使用Controller.ViewContext.ViewBag(「MyBag」) – RichC

0

沒有進一步的信息到您的業務邏輯,我可以在這裏的基礎......但是......似乎在視圖中設置任何ViewBag數據是一個Anti-Pattern

當View由於它是頁面生命週期的一部分而呈現時,您的ViewModel應該擁有它所需的所有內容,並且View和Masterpage應該只是使用數據,而不會生成它。

我也是一個FIRM信徒設置ViewModel相關的一切視圖,而不是ViewBag(這是個人偏好,但被廣泛接受)。

如果您進一步描述您的具體情況,也許我可以幫助您想出一個更好的模式。

public class LayoutViewModel 
{ 
  public bool UseFacebookConnect { get; set; } 
} 
public class SomeViewModel : LayoutViewModel 
{ 
  public string SomeData { get; set; } 
} 
public class SomeController : Controller 
{ 

    public ActionResult Index() 
        { 

      var someViewModel = new SomeViewModel  
       { 
        SomeData = "",  
        UseFacebookConnect = true 
       }; 

       return View(someViewModel); 
    } 
+0

我有一個FaceBook在母版頁內連接JavaScript代碼,但我需要將它隱藏在一些不需要社交功能的頁面上。 – user1615362

+0

所以在ViewBag中傳遞一個布爾值。 'ViewBag [「useFacebookConnect」] = false;'來自Controller ...而不是來自視圖。我會把邏輯放在'ActionFilter'中以保持你的代碼[DRY](http://en.wikipedia.org/wiki/Don't_repeat_yourself)。 –

相關問題