2014-03-26 54 views
2

我在我的ASP.NET MVC4应用程序中注册Global.asax中有一个区域。每当我尝试访问的默认路由:为什么ASP.NET MVC4为路线添加尾部斜线?

whateverurl.tld/Area 

ASP.NET MVC4增加了尾部斜杠它使得它看起来像:

whateverurl.tld/Area/ 

和Visual Studio 2012的嵌入式IIS服务器抛出回404.

但是,如果我浏览到'whateverurl.tld/Area/Index',它就会显示出来。我有另一条使用完全相同的默认路由(sans控制器名称)的路由,并且当我在浏览器中访问该路由时,它将转到'whateverurl.tld/OtherArea',而没有结尾的斜杠。正如预期的那样,没有结尾的斜杠,显示了控制器的索引。

这让我绝对疯了。每个区域的配置几乎完全相同。我可以想出一些解决方法,但我真的需要知道是什么原因导致此行为,以避免将来出现这种情况。

区域1(不工作):

 context.MapRoute(
      "Area1_default", 
      "Area1/{action}/{id}", 
      new { controller = "Area1", action = "Index", id = UrlParameter.Optional } 
     ); 

区域2(工作):

 context.MapRoute(
      "Area2_default", 
      "Area2/{action}/{id}", 
      new { controller = "Area2", action = "Index", id = UrlParameter.Optional } 
     ); 

的Global.asax.cs:

 Area1Registration aReg1 = new Area1Registration(); 
     AreaRegistrationContext a1c = new AreaRegistrationContext(aReg1.AreaName, RouteTable.Routes); 
     aReg1.RegisterArea(a1c); 

     Area2Registration aReg2 = new Area2Registration(); 
     AreaRegistrationContext a2c = new AreaRegistrationContext(aReg2.AreaName, RouteTable.Routes); 
     aReg2.RegisterArea(a2c); 

UPDATE:我用一个路由调试器来查看它匹配的路由。它不匹配任何路线。不确定到底发生了什么。我无法获取路由调试信息来显示,因为显然在路由匹配完成之前添加了“/”。

+0

你是如何注册这些路线? – kheya

+0

刚刚更新,应该提供更多信息 – NewToMS

+0

@NewToMS我不知道你为什么得到这个斜杠,但只是为了尝试,如果你想在'context.MapRoute'中替换''Area1/{action}/{id }“,''Area1/{controller}/{action}/{id}”,' – Leron

回答

2

朋友,

我在我的web根目录中有一个与该区域同名的目录。重命名解决了我的问题。这解释了斜线 - /意味着它正在查看一个目录。

谢谢!

+1

可以证实这是造成问题的原因。也尝试重命名文件夹,事后工作正常 - 没有更多的尾随斜杠重定向。看起来IIS更喜欢指向一个文件夹,而不是首先在RouteTable中匹配路由。不想重命名我的文件夹 - 有没有办法在应用程序根目录下“忽略”文件夹? –

1

这应该解决它。

RouteTable.Routes.AppendTrailingSlash = false; 

把它放在你的Global.asax中。

+0

它不能解决它。如果您的应用程序根目录中有一个与控制器名称相同的文件夹,它将始终尝试指向该文件夹。无论如何,认为AppendTrailingSlash默认为false。 –