2013-10-02 52 views
3

我在MVC 2應用程序中使用便攜式區域。我在文件夾 /Scripts/ViewModels/ViewModel.js中有一個JavaScript文件,但是當我嘗試訪問它時,我得到一個未找到的404錯誤。便攜式地區註冊看起來像這樣:如何設置MVC可移植區域以使用複雜目錄結構中的資源?

private void RegisterRoutes(AreaRegistrationContext context) 
    { 
     context.MapRoute(
      AreaName + "_resources", 
      base.AreaRoutePrefix + "/resource/{resourceName}", 
      new { controller = "EmbeddedResource", action = "Index"}, 
      new[] { "MvcContrib.PortableAreas" } 
     ); 

     context.MapRoute(
      AreaName + "_scripts", 
      base.AreaRoutePrefix + "/Scripts/{resourceName}", 
      new { controller = "EmbeddedResource", action = "Index", resourcePath = "scripts" }, 
      new[] { "MvcContrib.PortableAreas" } 
     ); 

     context.MapRoute(
      AreaName + "_images", 
      base.AreaRoutePrefix + "/images/{resourceName}", 
      new { controller = "EmbeddedResource", action = "Index", resourcePath = "images" }, 
      new[] { "MvcContrib.PortableAreas" } 
     ); 

     context.MapRoute(
      AreaName + "_default", 
      base.AreaRoutePrefix + "/{controller}/{action}/{id}", 
      new { action = "Index", id = UrlParameter.Optional }, 
      new[] { "PortableAreaDemo.PortableAreas.Areas.Demo.Controllers", "MvcContrib" } 
     ); 
    } 

在我試圖包括腳本與 <script src="@Url.Content("~/Demo/Scripts/ViewModels/ViewModel.js")"></script> 文件視圖模板,我得到了以下網址/Demo/Scripts/ViewModels/ViewModel.js但該文件是不可訪問,。我只能訪問腳本文件,它們是Scripts文件夾的直接子項。

+0

你的問題沒有意義。您建議您嘗試從'/ Scripts/ViewModels/ViewModel.js'加載文件,但是您聲明URL'/ Demo/Scripts/ViewModels/ViewModel.js'不起作用。是否需要路徑中的'/ Demo /'文件夾? – Claies

+0

@Andrew:我確實需要路徑中的Demo,但這不是一個文件夾,而是該區域的名稱。問題是來自/ Demo/Scripts/ViewModels /文件夾的文件未加載。如果我把文件放在腳本文件夾中,那就沒問題。所以例如/Demo/Scripts/ViewModel.js加載正確。 – Zoliqa

+0

好的,我很抱歉,我明顯誤解了你的問題......所以你的問題不在該區域,而是從腳本文件夾的子文件夾訪問文件。 – Claies

回答

2

MSDN Documentation的路由,

有時你不得不處理包含可變數量的URL段的URL請求。定義路由時,可以指定如果URL的模式中包含的段多於模式中的段,則額外的段將被視爲最後一段的一部分。要以這種方式處理附加分段,請用星號(*)標記最後一個參數。這被稱爲全部參數。具有catch-all參數的路由也將匹配不包含最後一個參數的任何值的URL。

所以,你應該嘗試添加*爲腳本路徑爭論的開始,例如,base.AreaRoutePrefix + "/Scripts/{*resourceName}",這將允許參數作爲一個包羅萬象的處理。 resourceName然後可以被分配到/ViewModel.js/ViewModels/ViewModel.js。如果沒有*,則將/ViewModels段視爲另一個段,這會導致路由引擎不將該路由評估爲匹配,並繼續執行定義的路由,並且404是沒有路由與URL路徑的模式匹配的結果提供。

+0

我覺得最好的答案是不要使用便攜式區域。但除此之外,就是這樣。 –

0

寫出下列路線[前必須插入「/腳本/ {}資源名稱」路線]

context.MapRoute(
     AreaName + "_viewmodels_scripts", 
     base.AreaRoutePrefix + "/Scripts/viewmodels/{resourceName}", 
     new { controller = "EmbeddedResource", action = "Index", resourcePath =  "scripts.viewmodels" }, 
     new[] { "MvcContrib.PortableAreas" } 
    ); 

,不要忘記設置「生成操作」爲「嵌入的資源」爲您腳本

0

回答here

在web.config中添加爲每種文件類型:

<system.webServer> 
    <handlers> 
    <add name="js" path="*.js" verb="*" type="System.Web.Handlers.TransferRequestHandler" resourceType="File" preCondition="integratedMode" /> 
    </handlers> 
</system.webServer> 

這將使IIS嘗試使用定義的路由,而不是搜索靜態文件。