2008-12-22 68 views
10

我想要想出一個創建「動態」路由的方法。我的意思是說,我希望能夠爲每次擊中分配控制器和路線的動作,而不是直接映射它。Asp.Net MVC - 「動態」路由的最佳途徑

例如,路線可能看起來像這樣的「路徑/ {對象}」,並且當該路徑被擊中時,執行查找以提供適當的控制器/動作來呼叫。我試過發現創建自定義路由處理程序的機制,但目前文檔/可發現性有點陰暗(我知道,它的測試版 - 我不會再期待)。雖然,我不確定這是否是最好的方法,甚至可能是控​​制器工廠,或者甚至是執行所有映射的默認控制器/操作可能是最佳路線(無雙關語意圖)。

任何意見,將不勝感激。

+1

請看一看這個小手冊:MVC .Net Routing](http://stackoverflow.com/questions/379558/mvcnet-routing#379823),部分**選項3 ** - 它描述瞭如何構建自定義請求處理鏈。 – maxnk 2008-12-22 06:34:18

回答

3

你總是可以使用catch的所有語法(我不知道名稱是否合適)。

路線: routeTable.MapRoute( "Path", "{*path}", new { controller = "Pages", action = "Path" });

控制器動作被定義爲: public ActionResult Path(string path)

在爲控制器,你將有一個路徑的動作,所以只需要灑它和分析。

要調用另一個控制器,你可以使用RedirectToAction(我認爲這是更正確的方法)。通過重定向,您可以爲其設置永久性重定向。 或者使用類似的東西:

internal class MVCTransferResult : RedirectResult 
    { 
     public MVCTransferResult(string url) : base(url) 
     { 
     } 
     public MVCTransferResult(object routeValues) 
       : base(GetRouteURL(routeValues)) 
     { 
     } 

     private static string GetRouteURL(object routeValues) 
     { 
      UrlHelper url = new UrlHelper(
       new RequestContext(
         new HttpContextWrapper(HttpContext.Current), 
         new RouteData()), 
         RouteTable.Routes); 
      return url.RouteUrl(routeValues); 
     } 

     public override void ExecuteResult(ControllerContext context) 
     { 
      var httpContext = HttpContext.Current; 

      // ASP.NET MVC 3.0 
      if (context.Controller.TempData != null && 
       context.Controller.TempData.Count() > 0) 
      { 
       throw new ApplicationException(
        "TempData won't work with Server.TransferRequest!"); 
      } 
      // change to false to pass query string parameters 
      // if you have already processed them 
      httpContext.Server.TransferRequest(Url, true); 

      // ASP.NET MVC 2.0 
      //httpContext.RewritePath(Url, false); 
      //IHttpHandler httpHandler = new MvcHttpHandler(); 
      //httpHandler.ProcessRequest(HttpContext.Current); 
     } 
    } 

但是這種方法需要在IIS或IIS EXPRES Casinni運行不支撐Server.Transfer方法

+0

你知道爲什麼我們需要在調用TransferRequest之前檢查TempData中的數據嗎? – yurart 2017-02-28 14:15:45