ASP .Net MVC5 使用檔案路徑訪問檢視檔案的方法
基礎需知
1、MVC中的控制器都繼承與System.Web.Mvc.Controller,通過重寫此類的OnActionExecuting方法可以達到攔截器的功能(此方法是在本Controller的所有Action執行之前執行)。
2、MVC的路由配置中,如果花括號內第一個字元是*,表示是可變長度的路徑,如:A/{*url}可以匹配到A/abc和A/aa/aaa等。其中的字元url可以替換為任何字元。
3、MVC的路由規則是多個路由從上往下匹配,匹配到任何一個就停止其它匹配。
4、MVC的路由有一個RouteExistingFiles屬性,用於標識是否處理與現有檔案匹配的 URL,預設是false。
5、MVC的設定中,頁面的跳轉是由控制器來執行的,直接通過檔案路徑訪問是一個錯誤的目標。但現實的需求總是千變萬化的,故提供於此給有需要的人員參考。
6、在web.config中的system.webServer標籤下的handlers中新增<add name="testView" verb="*" path="*.cshtml" type="System.Web.StaticFileHandler" />也可以實現這個目的,但是cshtml不能編譯,適用於html檔案。
實現思路
基本思路為讓路徑url進入路由,並模仿普通MVC方式呼叫檢視,具體如下:
1、先將RouteExistingFiles
2、建立一個空的控制器,專用於檢視呼叫
2、使用攔截器獲取輸入的url並跳轉
實現步驟-【配置路由】
由於所有的檢視都存放在Views資料夾下,此處配置攔截所有以Views開頭的url請求。在RouteConfig.cs檔案中新增以下程式碼,需要注意新加入的路由與原有路由的上下關係:
routes.RouteExistingFiles = true; routes.MapRoute( name: "cshtml", url: "Views/{*url}", defaults: new { controller = "CsHtml", action = "Proxy" } );
本文最終效果如下:
實現步驟-【配置跳轉控制器】
新建一個控制器CsHtmlController並新增一個名為Proxy的Action,在攔截器中通過路徑名url來獲取介面路徑。這三個名稱都在上一步的路由配置中定義。
程式碼如下:
public class CsHtmlController : Controller
{
public ActionResult Proxy()
{
// 攔截器沒跳轉時的404頁面
return View("~/Views/404.cshtml");
}
protected override void OnActionExecuting(ActionExecutingContext filterContext)
{
Dictionary<string, object>.Enumerator enu = filterContext.RouteData.Values.GetEnumerator();
while (enu.MoveNext())
{
if (enu.Current.Key == "url")
{
string url = (string)enu.Current.Value;
if (url.EndsWith(".cshtml"))
{
filterContext.Result = View("~/Views/" + url);
break;
}
}
}
}
}
至此,說明結束。