Asp .Net MVC 5 文件夹名称和路由冲突
Asp .Net MVC 5 Folder name and Routing conflict
我在 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 似乎相信我正在尝试访问文件夹 /Backoffice 并给我一个 404 错误而不是执行 Backoffice::Index()
.
在这种情况下,如何配置 IIS 以预期的方式运行?或者,这真的是将视图保存在特定文件夹中的唯一最佳方式吗?
MVC 根据它们是否存在于磁盘上来路由某些操作。如果您在根级别有一个文件夹 /BackOffice,那么这似乎是 MVC 将要解决的问题(我知道如果文件存在则直接路由;我没有意识到文件夹是框架检查的内容也)。考虑将文件夹或控制器重命名为其他名称,这样就不会出现命名冲突。这是 "by convention" 方法的问题....
我做了一些研究并使用了此处的评论和答案中的信息,并开始了解 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 运行时处理。如果我说错了,我当然希望有人在最后的陈述中纠正我。
我在 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 似乎相信我正在尝试访问文件夹 /Backoffice 并给我一个 404 错误而不是执行 Backoffice::Index()
.
在这种情况下,如何配置 IIS 以预期的方式运行?或者,这真的是将视图保存在特定文件夹中的唯一最佳方式吗?
MVC 根据它们是否存在于磁盘上来路由某些操作。如果您在根级别有一个文件夹 /BackOffice,那么这似乎是 MVC 将要解决的问题(我知道如果文件存在则直接路由;我没有意识到文件夹是框架检查的内容也)。考虑将文件夹或控制器重命名为其他名称,这样就不会出现命名冲突。这是 "by convention" 方法的问题....
我做了一些研究并使用了此处的评论和答案中的信息,并开始了解 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 运行时处理。如果我说错了,我当然希望有人在最后的陈述中纠正我。