2009-04-16 101 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