實戰:把ASP.NET MVC中的Views下面的視圖放到Views文件夾外
園子里寫的文章的都是把控制器從傳統的項目中的Controllers拿出來單獨放
,但很少幾乎沒有把視圖從Views拿出去這樣的文章,今天來寫一個.
今天學習MVC的時候,試着實現了一下,其實很簡單!一步步解決問題就行了,下面記錄如下,供需要的同學參考,寫的不好,輕噴,謝啦
首先咱們自己建一個MyCustomView文件夾 下面建一個Home文件夾里面放Index.cshtml視圖
刪除原來Views/Home/Index.cshtml
很明顯這個時候訪問Home/Index肯定會出現最經典的錯誤
原來MVC找視圖的時候是根據路由去找對應視圖的
通過razor視圖引擎的默認視圖位置去找視圖
步驟一:我們在Global.asax.cs中的Application_Start方法加下面的代碼
ViewEngines.Engines.RemoveAt(0);
ViewEngineCollection vec = ViewEngines.Engines;
RazorViewEngine razor = vec[0] as RazorViewEngine;
razor.ViewLocationFormats = new string[]{"~/Views/{1}/{0}.cshtml","~/Views/Shared/{0}.cshtml","~/MyCustomView/{1}/{0}.cshtml" };
其實就是做了一個小小的優化,讓mvc找視圖的時候不找vb那些視圖以及加了一個自定義的視圖路徑"~/MyCustomView/{1}/{0}.cshtml"
這個時候我們再訪問Home/Index依然有問題(雖然找到了視圖) 問題變了
這個時候很明顯,已經開始在我們自定義加的視圖文件夾下面開始找視圖了.但是找到了,卻提示這個視圖文件沒派生自 WebViewPage 或 WebViewPage<TModel>。
我們知道Razor視圖最終都會編譯成一個類,這個類會自動繼承WebViewPage 或 WebViewPage<TModel>,(這個是強類型視圖了..)(大家可以用反編譯工具看見)
但是我們把視圖從Views下面拿出來了, MVC框架就不會編譯的時候讓他繼承WebViewPage 或 WebViewPage<TModel>
步驟二:那么既然你MVC框架不給我們的視圖繼承這個,我們自己就不能來嗎?用大拇指想想就知道肯定是可以的了!
兩種方法:
第一種:這種最簡單.把Views下面的web.config文件復制一個到MyCustomView下面,這樣錯誤就沒有了!就可以正常訪問找到視圖了
原理就是
上圖中Views文件夾下面的Web.config中有一個節點配置了這么一句話<pages pageBaseType="System.Web.Mvc.WebViewPage"> .很明顯是繼承WebViewPage 的意思
有這個,此文件夾里面所有的視圖編譯的時候會自動運行這個,肯定就繼承了WebViewPage
視圖文件多的時候很適合這樣做哦
我們知道ASP.NET框架對Web.config是有就近原則和繼承原則的,也就是你在網站根目錄的Web.config下面的配置,適用於網站下面所有的程序,當你在子文件下面再有Web.config的時候,他會就近選擇使用(如果配置局部,想不使用全局配置,就可以自己加一個配置文件哦,是不是有點類似CSS中的就近原則,哈哈)
第二種:直接在視圖中加一句指令
@inherits System.Web.Mvc.WebViewPage
作用不言而喻,當前視圖會繼承WebViewPage ,但多個視圖的時候每個里面都寫一句這個煩不煩!!所以不推擠這個啦!
有問題歡迎留言,把控制器放到單獨的類庫項目(單獨的程序集)中這里就不寫了很簡單,園子文章太多了