MVC4将JavaScript文件路由到控制器

时间:2013-09-26 20:06:54

标签: asp.net-mvc-4 routes

这是我正在尝试做的一个例子。

提供从test.js到控制器动作的MVC路由,例如

> http://localhost/MVCScripts/test.js?id=123

到控制器

> http://localhost/Home/RenderJavascript?id=123

这背后的原因是根据id生成从服务器呈现的动态js文件。 JS文件将通过嵌入到其他网站来链接。

我已尝试设置web.config以排除相关脚本文件夹:

<handlers>
     <add name="scripts" path="/MVCScripts/*" verb="GET" type="System.Web.Handlers.TransferRequestHandler" />
</handlers>

然后添加了一条路线,例如:

routes.MapRoute(
            name: "EmbedCode",
            url: "MVCScripts/test.js",
            defaults: new { controller = "Home", action = "RenderJavascript", id = UrlParameter.Optional }
        );

调用

> http://localhost/MVCScripts/test.js?id=123

我得到了

The controller for path '/MVCScripts/test.js' was not found or does not implement IController.

请注意,我的目标是使用MVC路由。感谢

1 个答案:

答案 0 :(得分:2)

如果您在IIS集成管道模式下运行,请确保将以下处理程序添加到<handlers>节点的<system.webServer>集合中:

<system.webServer>
    <handlers>
        ...
        <add name="DynamicScript" path="MVCScripts/test.js" verb="GET" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
   </handlers>
</system.webServer>

这将确保静态.js扩展将通过托管的ASP.NET管道路由,而不是由IIS直接作为静态文件提供(显然在您的情况下找不到)。当它通过ASP.NET管道获得服务时,它显然会达到你必须在默认路由之前定义的路由:

public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

    routes.MapRoute(
        name: "EmbedCode",
        url: "MVCScripts/test.js",
        defaults: new { controller = "Home", action = "RenderJavascript", id = UrlParameter.Optional }
    );

    routes.MapRoute(
        name: "Default",
        url: "{controller}/{action}/{id}",
        defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
    );
}