2016-01-18 57 views
1

我有一個ASP.Net MVC 5網站,並且在某些情況下需要動態地將所有傳入請求路由到特定的Controller和Action。基於某些條件動態地重新路由所有請求

例如,如果該數據庫不存在,我想重新路由所有傳入請求發送到特定動作,如SetupController.MissingDatabase

public class SetupController : Controller 
{ 
    public ActionResult MissingDatabase() 
    { 
     return View(); 
    } 
} 

我想檢查此條件(數據庫存在)爲每個請求。最好在管道的早期執行檢查,而不是在每個Action的頂部或每個Contoller中執行檢查。當然,如果傳入的請求被路由到SetupController.MissingDatabase,我不需要執行檢查或重新路由請求。

完成此操作的最佳方法是什麼?

具體而言,ASP.Net MVC 5管道中的哪個位置是執行此類檢查的最佳位置,以及如何重新路由傳入的請求?

+0

本文可能有幫助:http://blog.falafel.com/custom-filter-asp-net-mvc-5/。基本上創建一個自定義操作過濾器並重寫OnActionExecuting或OnActionExecuted。 – dnndeveloper

回答

0

您可以創建一個操作過濾器來執行該操作並將其註冊到應用程序級別,以便它將針對所有傳入請求執行。

public class VerifySetupIsGood : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(ActionExecutingContext context) 
    { 
     var dbExists=VerifyDataBaseExists(); 
     if (! dbExists) 
     { 
      var values = new Dictionary<string, string> {{"action", "MissingDatabase"}, 
                 {"controller", "Setup"}}; 

      var routeValDict = new RouteValueDictionary(values); 
      //redirect the request to MissingDatabase action method. 
      context.Result = new RedirectToRouteResult(routeValDict); 
     } 
    } 
} 

假設VerifyDataBaseExists()執行你的代碼來檢查數據庫是否存在並返回一個布爾值。現在的global.asax.cs

protected void Application_Start() 
{  
    //Existing code goes here 

    GlobalFilters.Filters.Add(new VerifySetupIsGood()); 
    FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); 

    //Existing code goes here 
} 

您可以更新動作過濾器,如果需要檢查請求的一個子集,以及註冊在Application_Start事件這個動作過濾器。您可以從ActionExecutingContext的對象中獲取請求url並使用它來執行檢查。

+0

我能夠通過以下修改得到它: var routeDictionary = new RouteValueDictionary {{「action」,「MissingDatabase」},{「controller」,「Setup」}}; context.Result = new RedirectToRouteResult(routeDictionary); – mattman

+0

我的不好!我的帖子來自內存。沒有在VS中編譯它。現在更正爲未來的讀者。謝謝 – Shyju