我收到了一个使用 Asp.Net MVC4 构建的原型(prototype)应用程序。它目前正在用一个使用 NInject、ServiceLocator 和所有的自定义 Controller 工厂替换默认 Controller 工厂。
问题在于,通过替换默认 Controller 工厂,对 JS 文件的请求被视为对 Controller 和操作的合法请求。
因此,查看 Visual Studio 创建的默认模板,路由配置如下所示:
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
}
看完之后,我问自己:为什么 Asp.Net MVC 无法解释对“/Scripts/jquery.js”的请求?我的意思是,为什么它不认为“Script”是一个 Controller 而“jquery.js”是一个 Action ?
因为如果我禁用 Controller 工厂覆盖,项目就可以工作,所以我只能假设默认工厂负责那种检查。这意味着“/Scripts/jquery.js”确实传递给了 Controller 工厂,这是我真的不知道的事情。
任何人都可以阐明这一点吗?
在覆盖controller factory时应该做什么样的处理才能避免此类问题?
最佳答案
这不是因为 MVC 如何处理对 jquery.js 的请求,而是因为 IIS 处理对 jquery.js 的请求的方式。 IIS 假定.js、.jpg 等资源都是静态资源,因此不需要通过ASP.NET 引擎传递它们。为了防止这种情况发生,您可以在 web.config 中添加一行,作为您希望 IIS 保留的路径。
<system.webserver>
<handlers>
<add name="scripts" path="/Scripts/*" verb="GET" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0"/>
</handlers>
</system.webserver>
添加类似的东西应该允许您的 JS 文件通过 ASP.NET 提供服务,而不是直接通过 IIS。
关于c# - 为什么 CSS 和 JS 文件绕过 Asp.Net MVC 路由?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16948933/