2

我正在寻找创建一个 MVC3 网站。我们至少需要两个区域,但每个区域都需要不同的 url。像这样:

domain.com/ 转到 /

admin.domain.com/ 转到 /areas/admin

anotherSite.com/ 转到 /areas/portal

在做了一些研究之后,我发现了Lucero 的链接,您可以使用 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“找不到资源”。

更新 我已经尝试过在网址开头使用区域名称和不使用区域名称。

“门户/{controller}/{action}/{id}”

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

4

1 回答 1

0

为了将 URL 区分为去往一个区域,区域名称需要是 URL 的一部分。否则,该区域将无法从 URL 解析,您将回退到默认路由。此外,最好将默认路由放在最后 - 以确保测试所有其他路由映射

注意在相应的 MapRoute 调用中添加了“Admin/”和“Portal/”:

    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" }
    );
于 2012-10-22T20:39:21.463 回答