2009-04-16 99 views
2

如何在ASP.NET MVC中創建自定義路由處理程序?ASP.NET MVC,操作URL結構

+0

是什麼你試圖達到?你需要更具體一點 – 2009-04-16 10:55:54

+0

嗨安德魯,我已經重寫了我的問題,我希望更具體。爲評論歡呼。傑米 – 2009-04-16 21:26:51

回答

6

ASP.NET MVC可以很容易地在Global.asax.cs中創建一個自定義路由處理:

routes.MapRoute(
     "Default", 
     "{controller}.aspx/{action}/{id}", 
     new { action = "Index", id = "" } 
    ).RouteHandler = new SubDomainMvcRouteHandler(); 

這將導致所有請求由指定的自定義RouteHandler被處理。對於這個特殊的處理程序:

public class SubDomainMvcRouteHandler : MvcRouteHandler 
    { 
     protected override IHttpHandler GetHttpHandler(System.Web.Routing.RequestContext requestContext) 
     { 
      return new SubDomainMvcHandler(requestContext); 
     } 
    } 

那麼你可以做任何你想要的,在這種情況下,SubDomainMvcHandler從URL抓取的子域名並將其傳遞給控制器​​的特性:

public class SubDomainMvcHandler : MvcHandler 
    { 
     public SubDomainMvcHandler(RequestContext requestContext) : base(requestContext) 
     { 
     } 

     protected override void ProcessRequest(HttpContextBase httpContext) 
     { 
      // Identify the subdomain and add it to the route data as the account name 
      string[] hostNameParts = httpContext.Request.Url.Host.Split('.'); 

      if (hostNameParts.Length == 3 && hostNameParts[0] != "www") 
      { 
       RequestContext.RouteData.Values.Add("accountName", hostNameParts[0]); 
      } 

      base.ProcessRequest(httpContext); 
     } 
    } 
+0

完美。謝謝傑森!出於興趣,感謝SO的解決方案的一般方法是什麼?評論或其他方式? – 2009-04-17 11:23:30

+0

我認爲在這樣的同行評審社區中,「感謝」已經足夠;-) – Jason 2009-05-08 19:46:34

+0

因此,它將成爲控制器方法中的一個屬性? – 2011-10-03 15:15:58