Dot-Net

如何在 ASP.NET MVC 中擁有同名的文件夾和控制器?

  • July 24, 2017

我有一個名為 Downloads 的 MVC 控制器。http://mysite/下載

我還想將一個物理文件放在一個名為http://mysite/Downloads/MyFile.zip的物理文件夾中。

如果我只是創建一個文件夾,我會在瀏覽到http://mysite/Downloads時得到 403 。(很可能是因為目錄瀏覽被禁用)但我希望 MVC 控制器啟動。

我怎麼做?

如果您瀏覽到http://mysite/Downloads/{ACTION}它將觸發您的控制器操作。

在您的範例中唯一不起作用的是/Downloads不採取任何行動。您可以重新編寫此 URL 以將您重定向到您的預設操作。

此外,您需要讓路由處理程序忽略您的下載文件。您可以在 global.asax 文件中添加一行以忽略所有 zip 文件或其他適合的忽略模式。

routes.Ignore("{resource}.zip");

從 .NET 3.5 開始,您可以路由現有文件:

public static void RegisterRoutes(RouteCollection routes) {
   routes.RouteExistingFiles = true;
   routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
   routes.MapRoute(
      name: "Default",
      url: "{controller}/{action}/{id}",
      defaults: new { controller = "Home", 
                         action = "Index", 
                         id = UrlParameter.Optional }
   );
}

因此,假設我們在站點根目錄上有一個名為Markets包含文件的 audio.mp3文件夾:

\Markets
\Markets\audio.mp3

假設存在 a MarketsController,如果我們請求Markets,它將被路由到Markets/Index

如果我們請求/Markets/audio.mp3,我們將獲得 mp3 文件,如果我們請求Markets/AnythingElse,則將應用正常路由。

引用自:https://stackoverflow.com/questions/1437386