2009-12-17 73 views
0

我所有的控制器都是基於BaseController,在它們之間共享屬性並覆蓋OnActionExecuting以基於路線設置一些值。如何從基礎控制器填充強類型的viewdata?

我正在創建一個BaseViewData類來爲我的所有視圖數據做同樣的事情。

目前我正在填充視圖的數據像這樣(C#):

var viewData = new BaseViewData 
{ 
    Name = "someName", 
    Language = "aLanguage", 
    Category = "aCategoryName" 
}; 

我在每一個需要查看數據動作做到這一點。某些屬性很常見,需要在每個動作中設置。 有沒有辦法在全球範圍內設置一些屬性?

如果我在BaseController的OnActionExecuting方法中實例化BaseViewData類,如何從常規控制器(從BaseController派生)中的操作訪問BaseViewData屬性?

更新響應丹尼斯 - 帕爾默:

我基本上做的,因爲我用計算機[「郎」]不被隨意填寫一些要求具有一個嘮叨的問題這一點。如果語言是英語,ViewData [「lang」]包含「en」,如果是日語,則包含「ja」(好吧,無論如何都應該)。我在BaseController的OnActionExecuting裏填充ViewData [「lang」]。

在我看來,我打個電話到基於語言中的一些部分的觀點:

<% Html.RenderPartial(ViewData["lang"] + "/SiteMenu"); %> 

但我隨機收到錯誤拋出那個狀態「無法找到/ SiteMenu」,它指向的事實ViewData [「lang」]沒有任何價值。我無法找到任何理由爲什麼ViewData [「lang」]不會被填充。所以,我重寫網站只使用強類型的視圖數據(並設置一些嚴格的默認值)。但如果另一種方法更好,我會這樣。

謝謝!

回答

1

我不知道我跟着你想要什麼做的,但如果你的觀點是在路由使用值顯示特定的信息,這似乎是增加了對的HtmlHelper自己的擴展方法將是一個更好的辦法去。

路線中是否包含名稱,語言和類別?如果是這樣,那麼HtmlHelper將有權訪問路線信息,並可以確定通過擴展方法顯示的內容。你的路線和你的觀點需要知道什麼是相關的?

更新:lang部分路線?如果是這樣,那麼我仍然認爲你可以編寫一個HtmlHelper擴展方法,直接查看路徑數據並確定要呈現哪個局部視圖。這樣你的控制器甚至不需要擔心設置ViewData [「lang」]。該視圖總是會知道如何基於路線進行渲染。

更新2:我認爲解僱使用HtmlHelper擴展方法,因爲它重新評估路由數據可能是過早優化的情況。你的控制器繼承方案聽起來過於複雜,你問這個問題,因爲你設置的方式ViewData是不可靠的。我懷疑從路線數據中提取價值會比設置和從ViewData讀取效率低,如果有的話。

從您的評論:

在控制器我使用lang值 以確定哪個視圖顯示爲 好。

這隻會讓我覺得爲了給出更好的建議,我需要看到更多的系統組件。如果您對每種語言都有不同的視圖,那麼爲什麼需要告訴視圖要使用哪種語言?

另一種考慮的替代方法是使用嵌套母版頁。您可以爲您的站點佈局設置一個主站頁面,然後爲每個只包含硬編碼lang值的語言設置一個嵌套主站頁面。

+0

是的,lang是我路線的一部分。在控制器中,我使用lang值來確定顯示哪個視圖。例如,www.apoads.com/en/Yokota。路線如下所示:「{language}/{b}」(b是base的簡寫,在這裏是軍事基地 - 與編程無關)。 – Chaddeus 2009-12-17 01:30:20

+0

我構建了一個html助手來獲取路由數據並返回基於路由令牌的語言。我的母版頁使許多引用這個值...使用HtmlHelper擴展意味着它正在做的工作,每次它被引用的時候得到這個值,是正確的?這就是爲什麼我將它設置在控制器上的原因之一,做了一次工作並多次參考該值。還是我誤會了? – Chaddeus 2009-12-17 02:10:50

+0

所有非常好的建議。就我而言,有一個主頁面可以根據語言拉取幾個不同的局部視圖。在其他觀點中,是的,這個語言是硬編碼的。我現在正在做的是構建一個BaseViewData類,使其成爲BaseController的一個屬性,並默認情況下用「en」實例化它。由於每個視圖都需要訪問一些關鍵的數據,我走了這條路。我仍然有你提出的HtmlHelper,以防萬一它變得方便。我感謝你的回覆。 – Chaddeus 2009-12-17 22:37:02

1

也許不是你有這樣的繼承方案,你可以只使用action filters添加你需要的數據。

+0

嗯......可能。感謝您的鏈接 - 我第一次看到它,並一直有意思查看更多的行動過濾器。 – Chaddeus 2009-12-17 00:31:43