繁体   English   中英

为什么 CSS 和 JS 文件绕过 Asp.Net MVC 路由?

[英]Why CSS and JS files bypass Asp.Net MVC routes?

我收到了一个使用 Asp.Net MVC4 构建的原型应用程序。 它目前正在用一个使用 NInject、ServiceLocator 和所有的自定义工厂替换默认的 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”的请求? 我的意思是,为什么它不认为“脚本”是一个 controller 而“jquery.js”是一个动作?

因为如果我禁用 controller 工厂覆盖,该项目就可以工作,所以我只能假设默认工厂负责这种检查。 这意味着“/Scripts/jquery.js”确实传递给了 controller 工厂,这是我真的不知道的事情。

任何人都可以阐明这一点吗?

在覆盖controller工厂时应该做什么样的处理才能避免此类问题?

这不是因为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提供。

经过一番研究后,我发现了史蒂文桑德森的书中的以下引用:

但是,路由系统仍会检查文件系统以查看传入的URL是否恰好与文件或磁盘匹配,如果是,则路由忽略该请求(绕过URL也可能匹配的任何路由条目),以便该文件将直接送达。 这对于静态文件非常方便,例如图像,CSS和JavaScript文件。 您可以将它们保存在项目中(例如,在/ Content或/ Script文件夹中),然后直接引用和提供它们,就像您根本不使用路由一样。 由于该文件确实存在于磁盘上,因此优先于您的路由配置。

相反,如果您希望路由配置优先于磁盘上的文件,则可以将RouteCollection的RouteExistingFiles属性设置为true。 (默认情况下是假的。)

这是非常有趣的东西,让我了解实际问题。 一个更简单的一个。 事实上,文件夹中没有相关的脚本。 至少不是在视图上请求完全相同版本的那些。 这是负责Asp.Net MVC认为它是一个控制器/动作请求。

参考: http//forums.asp.net/t/1536510.aspx/1

检查在您的链接或脚本之前使用“~/”,例如:src="~/assets/js/main.js"

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM