2011-02-01 33 views
7

我正在努力處理看起來很簡單的概念。如果我的ViewBag中有一個值供我的_Layout.cshtml使用,我該如何以及在哪裏設置該值?用於處理ASP.NET MVC 3視圖中的常見數據的方法

這裏是最明顯的(對我)的選擇,因爲我現在所看到:

  1. 在每個控制器(未乾)
  2. 創建我自己的控制器基地控制器繼承並設置裏設置的值在基類
  3. 在Global.asax.cs中設置的值的值(感覺髒)
  4. 創建一個ActionFilter設置數據和全局寄存器的過濾器(也認爲是錯誤的)
  5. 設置在值_ViewStart.cshtml(感覺非常錯誤的,非常髒)

例如:

_Layout.cshtml


<!DOCTYPE html> 
<html> 
<head runat="server"> 
    <title>@ViewBag.Title</title> 
</head> 
<body> 
    <div id="header"> 
     <h1>Welcome @ViewBag.UserName</h2> 
    </div> 
    <div id="content"> 
     @RenderBody() 
    </div> 
</body> 
</html> 

如果每個控制器設置用戶名值,這不是可怕幹。如果我用CodeIgniter這樣的東西來解決這個問題,我只需要創建自己的基礎控制器來處理這些常見的項目,並開始我的快樂之旅。 ASP.NET MVC 3有更好的選擇嗎?

+0

實際上,在這種特殊情況下 - 即時猜測「用戶名」實際上來自會話/表單身份驗證票證。所以你可能想要使用一個HTML幫助器,它使用FormsAuth代碼來抓取用戶名,然後渲染出一個MvcHtmlString - 只是一個想法... – RPM1984 2011-02-01 21:01:35

+0

嗯......好點。也許@ ViewBag.UserName不是最好的例子。不過,我現在更關心的是更大的局面。 – Greg 2011-02-01 22:59:11

回答

10

通用視圖模型和基礎控制器是IMO的方式。使用普通視圖模型作爲所有視圖模型的基類。使用基本控制器中的OnActionExecuted方法來獲取視圖模型(對於返回視圖的操作)並將其轉換爲公共視圖模型。設置當時的通用屬性。

0

比方說,我希望ViewBag.PageHeight對所有頁面的默認值爲1000,但是允許任何頁面/視圖覆蓋它。這是我在_Layout.cshtml中放置的內容:

頁面高度是@(ViewBag.PageHeight ?? 1000)

這似乎是有效的。

相關問題