2012-11-28 24 views
0

我在IIS上有很多主機名指向相同的MVC3應用程序。在MVC3中,如何通過MapRoute獲得頂級域名?

www.domain.com 
www.domain.co.uk 
www.domain.net 
... 

我怎樣才能獲得頂級域名(ES。「.COM」)當我設置如下所示的地圖路線?

Shared Sub RegisterRoutes(ByVal routes As RouteCollection) 
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}") 

    ' MapRoute takes the following parameters, in order: 
    ' (1) Route name 
    ' (2) URL with parameters 
    ' (3) Parameter defaults 
    routes.MapRoute(_ 
     "Default", _ 
     "{controller}/{action}/{id}", _ 
     New With {.controller = "Home", .action = "Index", .id = UrlParameter.Optional} _ 
    ) 

End Sub 

回答

1

您需要創建自定義路線。只需繼承Route,覆蓋GetRouteData幷包含用於TLD的路由信息​​。

http://msdn.microsoft.com/en-us/library/system.web.routing.route.getroutedata.aspx

路線:

public class RouteWithTld : Route 
{ 
    public RouteWithTld(string url, IRouteHandler routeHandler) : base(url, routeHandler) 
    { 
    } 

    public RouteWithTld(string url, RouteValueDictionary defaults, IRouteHandler routeHandler) : base(url, defaults, routeHandler) 
    { 
    } 

    public RouteWithTld(string url, RouteValueDictionary defaults, RouteValueDictionary constraints, IRouteHandler routeHandler) : base(url, defaults, constraints, routeHandler) 
    { 
    } 

    public RouteWithTld(string url, RouteValueDictionary defaults, RouteValueDictionary constraints, RouteValueDictionary dataTokens, IRouteHandler routeHandler) : base(url, defaults, constraints, dataTokens, routeHandler) 
    { 
    } 

    public override RouteData GetRouteData(HttpContextBase httpContext) 
    { 
     var baseData = base.GetRouteData(httpContext); 

     int pos = httpContext.Request.Url.Host.LastIndexOf('.'); 
     string tld; 
     if (pos == -1) 
     { 
      if (httpContext.Request.Url.Host == "localhost") 
       tld = "com"; 
      else 
      { 
       throw new InvalidOperationException("You need to handle this case."); 
      } 
     } 
     else 
      tld = httpContext.Request.Url.Host.Substring(pos + 1); 

     baseData.Values.Add("tld", tld); 

     return baseData; 
    } 
} 

映射它在global.asax中:

public static void RegisterRoutes(RouteCollection routes) 
{ 
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

    /*routes.MapRoute(
     "Default", // Route name 
     "{controller}/{action}/{id}", // URL with parameters 
     new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults 
    ); 
    * */ 

    var defaults = 
     new RouteValueDictionary(new {controller = "Home", action = "Index", id = UrlParameter.Optional}); 
    routes.Add(new RouteWithTld("{controller}/{action}/{id}", defaults, new MvcRouteHandler())); 

} 

和訪問控制器中的參數:

public class HomeController : Controller 
{ 
    public ActionResult Index() 
    { 
     ViewBag.Message = "Welcome to ASP.NET MVC. TLD: " + RouteData.Values["tld"]; 

     return View(); 
    } 

    public ActionResult About() 
    { 
     return View(); 
    } 
}