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

时间:2010-11-18 14:57:51

标签: asp.net-mvc-2

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

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

我更愿意:

www.webhost1.com/imagegallery

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

1 个答案:

答案 0 :(得分: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;
        }
    }

然后,您只需将其添加到路线中,并指定要应用路线的主机名。像这样:

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") }
        );

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