2012-12-16 42 views
11

我想了解RouteExistingFiles如何工作。 所以我創建了一個新的MVC 3互聯網項目(MVC 4的行爲方式相同),並將HTMLPage.html文件放到我的項目的Content文件夾中。 現在我去Global.asax文件和編輯的RegisterRoutes功能,所以它看起來像這樣:ASP.NET MVC 3:RouteExistingFiles = true似乎沒有效果

public static void RegisterRoutes(RouteCollection routes) 
{ 
    routes.RouteExistingFiles = true; //Look for routes before looking if a static file exists 

    routes.MapRoute(
      "Default", // Route name 
      "{controller}/{action}/{id}", // URL with parameters 
      new {controller = "Home", action = "Index", id = UrlParameter.Optional} // Parameter defaults 
      ); 
    } 

現在應該給我時,我請求本地主機的錯誤:XXXX /內容/ HTMLPage.html因爲沒有「Content」控制器,並且請求肯定會觸發默認模式。但是,我正在看到我的HTML頁面。 我在這裏做錯了什麼?我想我不得不放棄。 即使我添加的路由像這樣的:

routes.MapRoute("", "Content/{*anything}", new {controller = "Home", action = "Index"}); 

它仍然顯示我HTMLPage的內容。 當我請求像〜/ Content/HTMLPage這樣的網址時,我得到了索引頁面,但是當我添加文件擴展名如.html或.txt時,會顯示內容(或者404錯誤,如果文件不存在)。 如果任何人都可以在VS2012中查看,請告訴我您獲得的結果。 謝謝。

回答

5

RouteExistingFiles在沒有路由的情況下不會保留文件,只是在檢查文件是否存在之前檢查路由。如果沒有匹配的路線,它將繼續檢查是否有匹配的文件。

+0

具有「{控制器}/{動作}/{id}」模式的默認路由看起來很適合〜/ Content/HTMLPage.html請求。所以有一條匹配的路線。 –

+0

@OleksandrKaplun:只有當您確實擁有名爲「Content」的控制器以及名爲「HTMLPage.html」的控制器中的操作方法時,纔會匹配。 – Guffa

+0

這聽起來很有說服力,但仍然不起作用。這裏是我添加到我的RegisterRoutes函數的頂部:'routes.MapRoute( 「ExactMatch」, 「Content/HTMLPage.html」, new {controller =「Home」,action =「About」}); '。還向我展示了html頁面的內容。附:我明白它應該像這樣工作(手冊說它應該),但它不會,所以我猜這是我做錯了。我在本地測試VS2012和Windows 7. –

5

Visual Studio 2012使用IIS Express。您需要告訴IIS在傳遞給MVC路由系統之前不要攔截磁盤文件的請求。您需要設置preCondition在配置文件屬性爲空字符串:

<add name="UrlRoutingModule-4.0" type="System.Web.Routing.UrlRoutingModule" 
    preCondition="" /> 

在Win7/8,你可以在這個路徑上找到的配置文件:%userprofile%\Documents\IISExpress\config\applicationhost.config

+0

這對我有用,謝謝,但我認爲它不能配置每個解決方案? – Savage

+0

您可以在添加此模塊之前添加。請參閱https://svenaelterman.wordpress.com/2011/01/31/using-asp-net-4-0-extension-less-routing-on-iis-7-5/ – XPD

16

要在啓用路由你必須執行以下步驟靜態文件。

在RouteConfig.cs啓用路由現有的文件

routes.RouteExistingFiles = true; 

添加一個路由,你的路徑(確保專業化道路是廣義的路徑上)

routes.MapRoute(
      name: "staticFileRoute", 
      url: "Public/{file}/", 
      defaults: new { controller = "Home", action = "SomeAction" } 
     ); 

下一頁配置應用程序,從而使請求靜態文件由「TransferRequestHandler」處理。在webconfig下的system.webServer>處理程序中添加以下條目。

<add name="MyCustomUrlHandler2" path="Public/*" verb="GET" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" /> 

根據您的要求,'路徑'的值可以更通用或具體。但我更喜歡它根據需要總是非常具體。保持它的通用性將阻止提供其他特定於站點的資源,如.js或css文件。例如,如果上面的代碼被設置爲path =「*」,那麼甚至請求負責你的頁面顯示方式的css(在內容文件夾內)也會在Controller的操作中結束。一些你不會喜歡的東西。

相關問題