2012-10-22 102 views
2

我期待创建一个MVC3网站。我们至少需要两个区域,但每个区域都需要不同的网址。就像这样:mvc3区域有主机名

domain.com/进入/

admin.domain.com/进入/区域/管理

anotherSite.com/进入/区域/门户

之后做一些研究,我发现Lucero's link,您可以使用HostNameContraint如下:

public class HostNameContraint : IRouteConstraint 
{ 
    protected string _hostname; 

    public HostNameContraint(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(
      "Default", // Route name 
      "{controller}/{action}/{id}", // URL with parameters 
      new { area = "", controller = "Home", action = "Index", id = UrlParameter.Optional }, // Parameter defaults 
      new { hostname = new HostNameContraint("domain.com") }, 
      new[] { "MVCProject.Controllers" } 
     ); 

     routes.MapRoute(
      "Admin_Default2", // Route name 
      "{controller}/{action}/{id}", // URL with parameters 
      new { area = "Admin", controller = "Home", action = "Index", id = UrlParameter.Optional }, // Parameter defaults 
      new { hostname = new HostNameContraint("admin.domain.com") }, 
      new[] { "MVCProject.Controllers.Areas.Admin.Controllers" } 
     ); 

     routes.MapRoute(
      "Portal_Default2", // Route name 
      "{controller}/{action}/{id}", // URL with parameters 
      new { area = "Portal", controller = "Home", action = "Index", id = UrlParameter.Optional }, // Parameter defaults 
      new { hostname = new HostNameContraint("anotherSite.com") }, 
      new[] { "MVCProject.Controllers.Areas.Portal.Controllers" } 
     ); 

我有IIS设置,使它们指向了每个站点的应用程序的根文件夹中。指向根“Domain.com”的工作正常,但去“Admin.domain.com”或“Domain.com/admin/”出现404“资源无法找到。”

更新 我已经尝试过它与区域名称在URL的开始和没有。

“门户网站/ {控制器}/{行动}/{ID}”

的问题是,当“门户”区域是在路由,签名不匹配名称“anotherSite.com”,因此它回来说403.14 - 禁止。无法列出此目录的内容。同样重要的是要注意,当“Portal”区域是url参数时,HostNameConstraint的构造函数永远不会被调用。

回答

0

为了指出将URL区分为区域,区域名称需要成为URL的一部分。否则,该区域将无法从URL解析,您将回退到默认路由。而且,这是一个好主意,把你的默认路由最后 - 确保所有其他路径映射测试

注意在相应的图路线呼叫除了“管理/”和“门户网站/”的:

routes.MapRoute(
     "Admin_Default2", // Route name 
     "Admin/{controller}/{action}/{id}", // URL with parameters 
     new { area = "Admin", controller = "Home", action = "Index", id = UrlParameter.Optional }, // Parameter defaults 
     new { hostname = new HostNameContraint("admin.domain.com") }, 
     new[] { "MVCProject.Controllers.Areas.Admin.Controllers" } 
    ); 

    routes.MapRoute(
     "Portal_Default2", // Route name 
     "Portal/{controller}/{action}/{id}", // URL with parameters 
     new { area = "Portal", controller = "Home", action = "Index", id = UrlParameter.Optional }, // Parameter defaults 
     new { hostname = new HostNameContraint("anotherSite.com") }, 
     new[] { "MVCProject.Controllers.Areas.Portal.Controllers" } 
    ); 

routes.MapRoute(
     "Default", // Route name 
     "{controller}/{action}/{id}", // URL with parameters 
     new { area = "", controller = "Home", action = "Index", id = UrlParameter.Optional }, // Parameter defaults 
     new { hostname = new HostNameContraint("domain.com") }, 
     new[] { "MVCProject.Controllers" } 
    ); 
+0

是的,我已经试过它在开始和没有区域名称。 IE''Portal/{controller}/{action}/{id}“,//带参数的URL'问题是当路由中的”Portal“区域与名称”anotherSite.com“不匹配时应直接指向“Portal”区域,因此“anotherSite.com”与“Portal/{controller}/{action}/{id}”不匹配,//带参数' –