2010-11-18 37 views
1

我有3個域名都指向相同的MVC2應用程序。我現在得到的是作爲交通警的家庭控制器,並將其重定向到控制器並查看特定主機名。但我不喜歡的URI結果這導致...主機名如何包含在MVC2路由映射中?

例如: www.webhost1.com/webhost1/imagegallery www.webhost2.com/webhost2/imagegallery

我寧願有:

www.webhost1.com/imagegallery

有沒有辦法定義在Global.asax中的路由將包括主機名路由評估,以使URI看起來少冗餘?

回答

5

Aha!,它花了一些小把戲(和舊書中的一個高峯),但我想我已經解決了它。

您需要創建自定義路由約束。 這是我很快做出了一個:

public class hostnameConstraint : IRouteConstraint 
    { 
     protected string _hostname; 

     public hostnameConstraint (string hostname) 
     { 
      _hostname = hostname; 
     } 

     bool IRouteConstraint.Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection) 
     { 
      if (httpContext.Request.Url.Host == _hostname) 
       return true; 
      return false; 
     } 
    } 

然後你可以將它添加到您的路線,並指定要應用到路由哪個主機名。像這樣:

routes.MapRoute(
      "ImageGallery", "{controller}/{action}", 
      new { controller = "Home", action = "Index"}, 
      new { hostname = new hostnameConstraint("webhost1.com") } 
     ); 

routes.MapRoute(
      "ImageGallery", "{controller}/{action}", 
      new { controller = "Home", action = "Index"}, 
      new { hostname = new hostnameConstraint("webhost2.com") } 
     ); 

等等等等。我不知道你的路線如何佈局,但問題是現在你可以爲主機名分開路線。這應該使你能夠做你以後的事情。

+0

你先生是我的英雄!我只是測試了這個,它的工作完美。 – 2010-12-09 04:21:09

+0

這太棒了。究竟是我在尋找什麼。我正在創建一個可以託管域名重定向的網站。我希望網站能夠管理域名以及重定向。添加具有此約束的路由允許我在主機域下具有正常站點,並且任何其他域都將相應地重定向。謝謝! – 2013-12-19 07:02:11