8762 1
2016-03-29 Dodu 公司動態

最近在做一些比較基礎的部分,做到界面時想到一個問題:

在ASP.NET MVC(Razor View Engine)中,如果我要讓多個項目之間共享一個_Layout.cshtml,那樣的話對于維護程序和統一風格都是有比較大的幫助的。但是問題是,如果真的要共享的話,各個項目之間不同的元素該如何處理呢,比如:Logo,項目名稱等??吹搅薩LogOnPartial.cshtml文件讓我想起來一個方法,如果我在_Layout.cshtml里定義一個變量,然后再做一個Partial.cshtml,在這個Partial里為_Layout.cshtml中的變量賦值,這樣不就行了嗎,說簡單點就是定義一個在Layout和Partial里面"共用"的變量不就解決了嗎,趕緊試試。

結果是很快發現這貌似行不通,因為無論是Layout、View還是Partial,在運行時都是被編譯成一個類,并且生成了這個類的實例,然后按照一定的順序執行的,在設計階段還沒有實例呢,所以定義變量貌似不現實。于是又想到ViewBag和ViewData,試一下,又發現不行,各個View(Layout、Partial)中的ViewBag和ViewData實際上也是他們自已的,和其他的View沒有關系,在Partial的ViewData里添加一個元素,到了Loyout里面根本就找不見了。

那么Partial和Layout之間有什么聯系呢,答案很快出來了,Controller,他倆在生命周期存在時肯定是用了同一個Controller實例!趕緊調試下,果然發現在Partial執行時,Partial的ViewData和Controller的ViewData中的元素個數不同,這就說明他倆沒有使用同一個引用,于是在Partial里向Controller的ViewData添加一個元素,然后在Layout中已經調用過Partial的代碼下方嘗試讀取Controller.ViewData中的元素,果然得到了期望的結果。

用法示例:

ViewContext.Controller.ViewData.Add("test","abcd");

最后再查查MSDN,發現了另一個方法也能解決這個問題,即使用WebViewPage.Context.Items屬性,Context的類型為HttpContextBase,其Items屬性的描述如下:

“在派生類中重寫時,獲取一個鍵/值集合,該集合在 HTTP 請求過程中可以用于在模塊與處理程序之間組織和共享數據?!?

經測試,使用:

Context.Items["test"] ="abcd";

的方式也能達到在兩個View間“共享變量”的效果,但是我推薦使用第一種方法。


發表評論:

werqwer

werqwer 2016-10-22

<a href="12334"><a/>
    甘肃快3走势图走势图手机版