ASP.NET MVC中,在View和PartialView中”共用變數”的方法

來源:互聯網
上載者:User

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

在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中的元素,果然得到了期望的結果。

用法樣本:

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

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

“在衍生類別中重寫時,擷取一個鍵/值集合,該集合在 HTTP 要求過程中可以用於在模組與處理常式之間組織和共用資料。”

經測試,使用:

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

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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.