19

有没有办法到ASP.NET MVC 2应用程序内的区域映射到子域如ASP.NET MVC 2应用程序中的区域可以映射到子域吗?

movies.example.com/Theater/View/2

代替

example.com/Movies/Theater/View/2

其中{面积= “电影”, controller =“Theatre”,action =“View”,id = 2}。

+0

@mynameiscoffey,你有成功吗?我有完全一样的任务。 – 2010-02-12 08:20:53

回答

11

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

答案很遗憾,没有内置的支持。

不过,好消息是,很多人都尝试过,发现用自定义代码的成功是建立在路由的顶部:

如果你想知道如何在没有区域的情况下路由子域,那么在区域内执行应该不会更困难。去你的区域注册上下文,并使用你在那里选择的任何技术。区域只是将控制器和视图组合在一起的一种方式 - 它们对ASP.NET MVC本身没有太多内在意义(它们有一点点,但不是很多)。

+1

+1用于澄清答案。 – 2010-01-29 06:49:27

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/

3

我偶然发现了同样的问题,我建立的一个为我工作的解决方案,它在我的blog,希望这将是一些使用给你。

干杯 托尼

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

这显然相当一个黑客,但我用它结束了多么简单真的很开心。

你可以很容易地用这个代码动态地将一个子域映射到一个区域,但我只有两个区域,所以我只是分别注册每个区域。此外,这使我可以在每个区域内进行不同的布线。

+0

不幸的是我不工作。我有2个家庭控制器 - 其中之一是在子域。它像其他解决方案一样抛出'找到与控制器'Home'异常相匹配的多个类型。当我将它重命名为独特的名称时效果很好。但目前还不清楚如何生成子域的链接?我试过了@ Html.RouteLink(“Mobile”,“api_default”),但它生成了应用程序主页面的链接... – Cheburek 2011-11-07 13:29:58

相关问题