6

我想使用ASP.NET MVC 5自動生成一些JavaScript文件,並在其URL中使用正確的.js擴展名。創建一個以「.js」結尾並返回JavaScript的MVC路由?

這是我的問題;

我在整個我的網站使用require.js,它工作得很好。但是,並非我所有的JavaScript文件都是磁盤上的真實文件。其中一些必須在運行時生成。所以我寫了一個控制器來生成動態JavaScript文件,並在使用默認路由時提供它們;

// ~/Resource/CommonRes -- from ResourceController.CommonRes() 
define([], function() { 
    return { 
     "menuItemConfiguration":"Configuration", 
     "menuItemAdmin":"Admin", 
     "manageAccount":"Manage Account", 
     "logOff":"Log off" 
     ... 
    }; 
}); 

不過,我需要有可用的路線爲~/Scripts/Resources/CommonRes.js - 的.js擴展是至關重要的,因爲實際上我返回require.js模塊,要調用這樣;

require(['Resources/CommonRes'], function(commonRes) { 
    // code the uses the resource file 
}); 

在這種情況下,命名爲Resources/CommonRes模塊將始終以~/Scripts/Resources/CommonRes.js尋找。因此需要用這個擴展來提供它。

我似乎無法得到正確的路由。我嘗試了以下,但無濟於事;

routes.MapRoute(
    name: "Resource Scripts", 
    url: "Scripts/Resource/{action}", 
    defaults: new { controller = "Resource" }, 
    namespaces: new string[] { "AITrackRecord.Controllers" } 
); 

回答

8

Darin Dimitrov

IIS截獲該請求,因爲它包含文件擴展名,並劫持它認爲它是一個靜態的文件,而不是將它傳遞給你的應用程序。

添加到您的Web.config

<system.webServer> 
    <handlers> 
     <add name="ScriptsHandler" path="Scripts/Resource/*.js" verb="GET" 
      type="System.Web.Handlers.TransferRequestHandler" /> 
    </handlers> 
</system.webServer> 

然後,路線:

routes.MapRoute(
    name: "DynamicJavascript", 
    url: "Scripts/Resource/{action}.js", 
    defaults: new { controller = "Resource" } 
); 

樣品控制器:

public class ResourceController : Controller 
{ 
    public ActionResult MyScript() 
    { 
     return Content("var greeting = \"Hello World!\";"); 
    } 
} 

結果:

Result

+0

絕對正確!非常感謝這 - 它打開了大量的可能性! – 2014-09-23 08:08:07

相關問題