我所有的控制器都是基於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」]不會被填充。所以,我重寫網站只使用強類型的視圖數據(並設置一些嚴格的默認值)。但如果另一種方法更好,我會這樣。
謝謝!
是的,lang是我路線的一部分。在控制器中,我使用lang值來確定顯示哪個視圖。例如,www.apoads.com/en/Yokota。路線如下所示:「{language}/{b}」(b是base的簡寫,在這裏是軍事基地 - 與編程無關)。 – Chaddeus 2009-12-17 01:30:20
我構建了一個html助手來獲取路由數據並返回基於路由令牌的語言。我的母版頁使許多引用這個值...使用HtmlHelper擴展意味着它正在做的工作,每次它被引用的時候得到這個值,是正確的?這就是爲什麼我將它設置在控制器上的原因之一,做了一次工作並多次參考該值。還是我誤會了? – Chaddeus 2009-12-17 02:10:50
所有非常好的建議。就我而言,有一個主頁面可以根據語言拉取幾個不同的局部視圖。在其他觀點中,是的,這個語言是硬編碼的。我現在正在做的是構建一個BaseViewData類,使其成爲BaseController的一個屬性,並默認情況下用「en」實例化它。由於每個視圖都需要訪問一些關鍵的數據,我走了這條路。我仍然有你提出的HtmlHelper,以防萬一它變得方便。我感謝你的回覆。 – Chaddeus 2009-12-17 22:37:02