如何在ASP.NET MVC中使用相同名称的文件夹和控制器?

时间:2009-09-17 08:05:47

标签: .net asp.net-mvc asp.net-mvc-routing

我有一个名为Downloads的MVC控制器。 http://mysite/Downloads

我还想将物理文件放在名为http://mysite/Downloads/MyFile.zip的物理文件夹中。

如果我只是创建一个文件夹,那么在浏览http://mysite/Downloads时会得到403。 (很可能因为目录浏览被禁用) 但我希望MVC控制器能够启动。

我该怎么做?

2 个答案:

答案 0 :(得分:5)

如果您浏览到http://mysite/Downloads/{ACTION},它将触发您的控制器操作。

在您的示例中唯一不起作用的是没有操作的/Downloads。您可以重新编写此URL以将您重定向到默认操作。

此外,您需要让routehandler忽略您的下载文件。您可以在global.asax文件中添加一行来忽略所有zip文件或其他适合的忽略模式。

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

答案 1 :(得分:5)

从.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

假设存在MarketsController,如果我们请求Markets,则会将其路由到Markets/Index

如果我们要求/Markets/audio.mp3我们获取了mp3文件,如果我们请求Markets/AnythingElse,则会应用正常路由。