我对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
时,它正常运行并在控制器Index
中执行操作Backoffice
,一切正常,但当我们拨打/Backoffice
时,我预料到它假设动作索引(通过路由配置),但IIS似乎相信我正在尝试访问文件夹/ Backoffice并给我404错误而不是执行Backoffice::Index()
。
在这种情况下,如何配置IIS以预期的方式运行?或者,它真的是将视图保存在特定文件夹中的唯一最佳方式吗?
答案 0 :(得分:3)
我做了一些研究,并在这里使用了评论和答案中的信息,并了解了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 :(得分:1)
MVC根据它们是否存在于磁盘上来路由某些操作。如果你在根级别有一个文件夹/ BackOffice,那么这似乎是一个复杂的问题,MVC将会遇到问题(我知道文件是直接路由的,如果它们存在的话;我没有意识到文件夹是框架也检查过)。考虑将文件夹或控制器重命名为其他内容,这样您就不会遇到此命名冲突。这是"按照惯例的问题"方法....