【问题标题】:.NET MVC - Controller/View and physical path?.NET MVC - 控制器/视图和物理路径?
【发布时间】:2013-07-15 08:55:28
【问题描述】:

是否可以为 URL 提供控制器/视图:

http://mydomain/SomeFolder/

还有一个类似的物理文件夹来放文件

http://mydomain/SomeFolder/*.*

当前 URL http://mydomain/SomeFolder/,如果 web.config 允许,则仅返回浏览物理文件夹,但我希望它返回视图,http://mydomain/SomeFolder/*.* 返回文件夹中包含的文件。

【问题讨论】:

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


    【解决方案1】:

    是的,这是可能的。假设您有~/SomeFolder/foo.png 文件和~/Controllers/SomeFolderController。您需要做的就是将RouteExistingFiles 属性设置为true:

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

    现在,当您导航到 /SomeFolder/SomeFolder/Index 时,将呈现 SomeFolder 控制器的 Index 操作。当您导航到/SomeFolder/foo.png 时,将提供静态文件。

    【讨论】:

    • 我想他想知道他是否可以创建一个*.* 路由或类似的路由来显示目录列表而不是为该路径定义的控制器/视图......我不认为这是可能的:/
    • @Tallmaris:不,抱歉,我的符号可能令人困惑。达林的答案看起来像我要找的(我下班回来会测试它。)
    • 它似乎不起作用,当我使用 routes.RouteExistingFiles = true; /SomeFolder/Somefile.pdf 说“找不到资源”。而且,是否对 CSS 加载有影响(有点随机)...
    • 最接近我想要的行为的是使用'routes.RouteExistingFiles = true;' + 有一个带有控制器的“catch-all”路由,它将检查文件是否存在并将其返回下载(我只授权了我的代码中的某些类型的文件,因此无法下载 .cs 和配置文件)。这更像是我想要的,但结果不稳定:一些非物理补丁会加载(控制器/视图),而其他会显示错误页面(找不到资源),以及随机加载或不加载 .css 和 .js 等。
    • 但我必须检查它是否破坏了我在某些文件夹中使用的基本 /index.htm 行为。
    【解决方案2】:

    这是我找到的解决方案,但我希望我找到了一些更简单的方法。

    使用此解决方案我仍然无法将文件放在http://mydomain/SomeFolder/ 的物理路径中,此文件夹不能物理存在,否则控制器/视图将不起作用。 但它将实现http://mydomain/SomeFolder/SomeFile.zip 返回与http://mydomain/**Content**/SomeFolder/SomeFile.zip 相同的文件,这是我的主要目标。

    我需要为http://mydomain/SomeFolder/http://mydomain/SomeFolder/anything/file/etc 提供两条不同的路线

            routes.MapRoute(
                "SomeFolder",
                "SomeFolder",
                new { controller = "SomeFolder", action = "Index" }
            );
    
            routes.MapRoute(
                "SomeFolderSub",
                "SomeFolder/{*any}",
                new { controller = "TryDownloadFile", action = "Index" }
            );
    

    routes.RouteExistingFiles 仍然是 false

    然后我有 SomeFolderController 返回 SomeFolder 的视图。 而TryDownloadFileController 检查文件是否存在于http://mydomain/Content/SomeFolder/ 而不是http://mydomain/SomeFolder/ 并返回。

    (我猜如果文件不存在,它应该返回一些 404 响应。应该是 return this.HttpNotFound();

    【讨论】:

    • 我不接受我的回答,因为它看起来只为 mydomain/SomeFolder/somefile 运行 SomeFolderController,而不是 mydomain/SomeFolder/[some x levels path]/somefile 。我不能花时间为每个潜在的子文件夹创建路线。
    • 我刚刚编辑并重新检查了它,似乎它只是缺少一个*
    猜你喜欢
    • 2012-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-05
    • 2021-02-16
    • 1970-01-01
    相关资源
    最近更新 更多