2015-10-20 111 views
1

我有在ASP .NET的mvc 5文件夹名称和路线一个恼人的问题,的ASP.NET MVC 5文件夹名称和路由冲突

这是默认的路由我使用的是:

 routes.MapRoute(
      name: "Default", 
      url: "{controller}/{action}/{id}", 
      defaults: new { controller = "Site", action = "Index", id = UrlParameter.Optional } 
     ); 

而且我还使用自定义视图引擎将视图映射到根文件夹而不是〜/ Views,这样我就可以以我的团队可以处理的方式组织HTML/CSS/JS文件。

的问题是:当我打电话/Backoffice/Index它会正常,在控制器Backoffice执行行动Index,都很好,但是当我们调用/Backoffice,我预计它设定的动作指数(由路由配置),而是, IIS似乎相信我试图访问文件夹/后台,并给我一个404错误,而不是执行Backoffice::Index()

如何在这种情况下配置IIS以预期方式运行?或者,它真的是将视图保存在特定文件夹中的唯一最佳方式吗?

+0

你试过'routes.RouteExistingFiles = true;'? – haim770

+0

您需要为** Default **以外的其他'Controllers'添加更多的'routes.MapRoute'。 –

+0

haim770由于某种原因确实对我有效。我不得不添加一些静态内容的路由忽略,但没有什么麻烦,如果您要详细说明一个正式的答案,谢谢。 – Felype

回答

2

我做了一些研究,并使用这里的评论和答案的信息,并得到了解如何MVC路线工作,以及如何处理IIS。

当我们建立

routes.RouteExistingFiles = true; 

的MVC运行时将忽略该文件夹中的所有文件,并开始使用的路线和URI仅仅是为了寻找控制器和行动,这意味着通过调用/SomeContent它将搜索控制器命名为Somefolder而不是文件夹。然后,我们可以配置告诉MVC运行时忽略某些特定URI格式提供静态内容:

routes.IgnoreRoute("SomeContent/CSS/{filename}.min.css"); 
routes.IgnoreRoute("SomeContent/JS/{filename}.min.js"); 

这将导致MVC忽略匹配这个模式的URI,并把它留给IIS来解决该怎么用它做什么,然后IIS将关注Web.Config,而不是将配置设置为服务于此类静态内容以及像往常一样使用和执行的处理程序。

使用此配置可​​以将MVC带入一个全新的控制级别,您可以明确定义哪些URI模式为静态内容提供服务,其他一切显式调用控制器上的操作,所有URI将首先由MVC运行时处理。如果我弄错了,我当然希望有人在最后的陈述中纠正我。

1

MVC根据它们是否存在于磁盘上来路由某些操作。如果你在根目录下有一个文件夹/ BackOffice,那么这似乎是一个复杂的问题,MVC将会解决问题(我知道文件如果存在就直接路由;我没有意识到文件夹是框架检查的东西太)。考虑将文件夹或控制器重命名为其他内容,以免发生命名冲突。这是“按惯例”的方法的问题....

+0

为了澄清,这与MVC无关。问题是IIS直接接管路由到文件系统资源,并且永远不会将请求传递给MVC。 –