【问题标题】:MVC Route to Action for Javascript fileJavascript 文件的 MVC 路由操作
【发布时间】:2013-02-07 06:43:01
【问题描述】:

我正在尝试添加一个 mvc 路由以从控制器生成一个 javascript。我添加了以下路线,但它不起作用:

routes.MapRouteWithName(
           "DataSourceJS", // Route name
           "Scripts/Entities/{controller}/datasource.js", // URL with parameters
           new { controller = "Home", action = "DataSourceJS"} // Parameter defaults,
           , null
           );

但是,如果我将路由更改为没有“.js”并导航到“Scripts/Entities/{controller}/datasource”,它就可以工作。但是我需要在那里有 .js 文件扩展名,我该怎么做?

【问题讨论】:

    标签: asp.net-mvc


    【解决方案1】:

    我该如何进行这项工作?

    IIS 拦截该请求,因为它包含一个文件扩展名并劫持它认为它是一个静态文件,而不是将其传递给您的应用程序。

    要使其正常工作,您应该告诉 IIS 不要这样做。在<system.webServer> 部分中,您可以添加以下处理程序以指示具有指定模式的请求应由托管管道处理:

    <system.webServer>
        <handlers>
            ...
            <add name="ScriptsHandler" path="Scripts/Entities/*/datasource.js" verb="GET" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
        </handlers>
    </system.webServer>
    

    有些人可能还会告诉你使用:

    <modules runAllManagedModulesForAllRequests="true" />
    

    但我不建议您这样做,因为这意味着对静态资源的所有请求现在都将流经托管管道,这可能会对您的应用程序产生负面的性能开销。处理程序语法允许您选择性地仅为某些路由模式和 HTTP 动词启用此功能。

    【讨论】:

    • 你的意思是它不起作用?你有错误还是什么?如果是这样,什么样的错误?您在浏览器中请求了什么网址?你创建了什么控制器?您的路线定义的顺序是什么? MapRouteWithName 是什么?它是自定义扩展方法吗?您使用哪个 Web 服务器来测试这个?是 IIS、IIS Express 还是 Cassini?
    • 抱歉,在您编辑问题之前我已回答。我要去以下地址:localhost:3768/Scripts/Entities/Addresses/datasource.js 我使用的是本地 IIS 服务器,运行 MVC4。 'MapRouteWithName' 是现在 VS12 中 MVC4 模板中的一个扩展。
    • 您有一个包含DataSourceJS 操作的AddressesController?并且您已将处理程序完全按照我的答案所示放置在您的 web.config 中?你有&lt;modules runAllManagedModulesForAllRequests="false" /&gt;?它不工作?
    • 好吧,我不得不承认这是漫长的一天,而且为时已晚,我把服务器处理程序放在了错误的 web.config 中,所以你原来的解决方案有效。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2014-04-05
    • 2016-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-24
    • 2016-05-22
    • 2018-09-17
    相关资源
    最近更新 更多