2015-10-20 109 views
1

我有在ASP .NET的mvc 5文件夾名稱和路線一個惱人的問題,的ASP.NET MVC 5文件夾名稱和路由衝突

這是默認的路由我使用的是:

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

而且我還使用自定義視圖引擎將視圖映射到根文件夾而不是〜/ Views,這樣我就可以以我的團隊可以處理的方式組織HTML/CSS/JS文件。

的問題是:當我打電話/Backoffice/Index它會正常,在控制器Backoffice執行行動Index,都很好,但是當我們調用/Backoffice,我預計它設定的動作指數(由路由配置),而是, IIS似乎相信我試圖訪問文件夾/後臺,並給我一個404錯誤,而不是執行Backoffice::Index()

如何在這種情況下配置IIS以預期方式運行?或者,它真的是將視圖保存在特定文件夾中的唯一最佳方式嗎?

+0

你試過'routes.RouteExistingFiles = true;'? – haim770

+0

您需要爲** Default **以外的其他'Controllers'添加更多的'routes.MapRoute'。 –

+0

haim770由於某種原因確實對我有效。我不得不添加一些靜態內容的路由忽略,但沒有什麼麻煩,如果您要詳細說明一個正式的答案,謝謝。 – Felype

回答

2

我做了一些研究,並使用這裏的評論和答案的信息,並得到了解如何MVC路線工作,以及如何處理IIS。

當我們建立

routes.RouteExistingFiles = true; 

的MVC運行時將忽略該文件夾中的所有文件,並開始使用的路線和URI僅僅是爲了尋找控制器和行動,這意味着通過調用/SomeContent它將搜索控制器命名爲Somefolder而不是文件夾。然後,我們可以配置告訴MVC運行時忽略某些特定URI格式提供靜態內容:

routes.IgnoreRoute("SomeContent/CSS/{filename}.min.css"); 
routes.IgnoreRoute("SomeContent/JS/{filename}.min.js"); 

這將導致MVC忽略匹配這個模式的URI,並把它留給IIS來解決該怎麼用它做什麼,然後IIS將關注Web.Config,而不是將配置設置爲服務於此類靜態內容以及像往常一樣使用和執行的處理程序。

使用此配置可​​以將MVC帶入一個全新的控制級別,您可以明確定義哪些URI模式爲靜態內容提供服務,其他一切顯式調用控制器上的操作,所有URI將首先由MVC運行時處理。如果我弄錯了,我當然希望有人在最後的陳述中糾正我。

1

MVC根據它們是否存在於磁盤上來路由某些操作。如果你在根目錄下有一個文件夾/ BackOffice,那麼這似乎是一個複雜的問題,MVC將會解決問題(我知道文件如果存在就直接路由;我沒有意識到文件夾是框架檢查的東西太)。考慮將文件夾或控制器重命名爲其他內容,以免發生命名衝突。這是「按慣例」的方法的問題....

+0

爲了澄清,這與MVC無關。問題是IIS直接接管路由到文件系統資源,並且永遠不會將請求傳遞給MVC。 –