19

有没有办法将 ASP.NET MVC 2 应用程序中的区域映射到子域,例如

movies.example.com/Theater/View/2

代替

example.com/Movies/Theater/View/2

其中{区域=“电影”,控制器=“剧院”,动作=“视图”,id = 2}。

4

4 回答 4

11

区域与路由没有直接关系,所以你的问题变成了“路由是否支持子域?”

不幸的是,对此的答案是没有内置支持。

然而,好消息是,许多人已经尝试使用构建在路由之上的自定义代码并取得了成功:

如果您弄清楚如何在没有区域的情况下路由子域,那么使用区域进行路由应该不会变得更加困难。转到您的区域注册上下文并使用您在其中选择的任何技术。区域只是将控制器和视图组合在一起的一种方式——它们对 ASP.NET MVC 本身并没有太多内在意义(它们做了一点,但不是很多)。

于 2010-01-12T07:15:14.890 回答
5

您可以使用 IIS7 URL 重写模块轻松地将域或子域映射到 MVC2 区域。这是将子域映射到两个区域的两个简单规则。如果请求是针对实际文件(即 CSS、JS 或图像文件),我添加了不使用此规则的限制。

这是您的 web.config 中的示例配置:

<system.webServer>
    <rewrite>
        <rules>
            <rule name="SubA Area">
                <match url=".*" />
                <action type="Rewrite" url="/SubA/{R:0}" />
                <conditions>
                    <add input="{HTTP_HOST}" pattern="suba.mydomain.com" />
                    <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
                </conditions>
            </rule>
            <rule name="SubB Area">
                <match url=".*" />
                <conditions>
                    <add input="{HTTP_HOST}" pattern="subb.mydomain.com" />
                    <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
                </conditions>
                <action type="Rewrite" url="/SubB/{R:0}" />
            </rule>
        </rules>
    </rewrite>
</system.webServer>

您必须更改以下规则才能使用您的特定用例。特别是如果您在需要使用的根区域上有控制器。在这种情况下,只需添加条件或创建新规则。

下载 IIS URL 重写模块(必需): http ://learn.iis.net/page.aspx/460/using-the-url-rewrite-module/

于 2010-06-29T17:33:23.993 回答
3

我遇到了同样的问题,我已经建立了一个对我有用的解决方案,它在我的博客中,希望它对你有用。

干杯托尼

于 2010-07-15T15:12:14.470 回答
1

我尝试了很多其他线程上提到的解决方案,发现事情很快变得太复杂了。似乎 ASP.Net MVC 希望您对 Route 进行子类化以执行这种高级路由,但它似乎对我不起作用。我永远无法将域映射到命名空间,因此我遇到了“模糊控制器”异常(因为我在两个命名空间中都有一个主控制器)。

最终,我使用约束将子域指向命名空间。

这是我的路线的样子。请注意,这条路线是针对“api”的。子域:

        context.MapRoute(
            "Api_Default",
            "{controller}/{action}/{id}",
            new { controller = "Home", action = "Index", id = UrlParameter.Optional },
            new { controller = new SubdomainRouteConstraint("api.") },
            new[] { "BendyTree.CloudSpark.Areas.Api.Controllers" }
            );

这是上面引用的“SubdomainRouteConstraint”类:

public class SubdomainRouteConstraint : IRouteConstraint
{
    private readonly string SubdomainWithDot;

    public SubdomainRouteConstraint(string subdomainWithDot)
    {
        SubdomainWithDot = subdomainWithDot;
    }

    public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection)
    {
        return new Regex("^https?://" + SubdomainWithDot).IsMatch(httpContext.Request.Url.AbsoluteUri);
    }
}

这显然是一个 hack,但我真的很高兴它最终变得如此简单。

您可以轻松地使用此代码将子域动态映射到一个区域,但我只有两个区域,所以我只是分别注册每个区域。另外,这让我可以自由地在每个区域内使用不同的路由。

于 2011-02-24T04:53:16.477 回答