1. 程式人生 > >ASP .Net MVC5 使用檔案路徑訪問檢視檔案的方法

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

設定為true並配置合理的路由,使路徑url能夠進入路由處理。

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;
                    }
                }
            }
        }
    }

至此,說明結束。