如何将主机名包含在MVC2路由映射中?

D.F*_*est 1 asp.net-mvc-2

我有3个域名都指向同一个MVC2应用程序.我现在所拥有的是作为交通警察的家庭控制器,并重定向到控制器和特定主机名的视图.但我不喜欢这导致的URI结果......

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

我更喜欢:

www.webhost1.com/imagegallery

有没有办法在global.asax中定义路由,包括路由评估中的主机名,以便URI看起来不那么多余?

小智 5

啊哈!它花了一些小小的东西(和旧书中的高峰),但我想我已经解决了它.

您需要创建自定义路由约束.这是我快速制作的那个:

 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;
        }
    }
Run Code Online (Sandbox Code Playgroud)

然后,您只需将其添加到路由中,并指定要将路由应用于哪个主机名.像这样:

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") }
        );
Run Code Online (Sandbox Code Playgroud)

等等等等.我不知道你的路线是如何布局的,但重点是现在你可以为主机名分别设置路线.哪个可以让你做你想做的事.