【问题标题】:MVC routing when a file actually exists at the specified location当文件实际存在于指定位置时的 MVC 路由
【发布时间】:2011-06-08 13:57:51
【问题描述】:

所以我在 IIS 7 下运行的 MVC 3 应用程序中有这样的路由:

routes.MapRoute(
               "VirtualTourConfig",
               "virtualtour/config.xml",
               new { controller = "VirtualTour", action = "Config" }
               );

诀窍是文件实际上存在于 /virtualtour/config.xml 中。似乎请求只是在该位置返回 xml 文件,而不是点击处理 XML、进行一些更改并返回自定义 XmlResult 的路由。

如果文件存在于磁盘上,有什么建议可以告诉我的应用程序点击路由而不是实际文件?

编辑:看来我可以在 Global.asax 的 RegisterRoutes 方法中使用 routes.RouteExistingFiles = true; 来告诉应用程序忽略磁盘上的文件。但是,这会全局设置标志并中断应用程序中的许多其他请求。例如,我仍然希望调用 /assets/css/site.css 来返回 CSS 文件,而不必专门为每个静态资产设置路由。所以现在问题变成了,有没有办法在每条路线的基础上做到这一点?

【问题讨论】:

  • 我认为没有一种简单的方法可以实现这一目标。为什么不简单地将静态文件移动到~/App_Data 文件夹?

标签: c# asp.net-mvc routing


【解决方案1】:

到目前为止,我发现的最佳答案是全局应用 routes.RouteExistingFiles=true,然后有选择地忽略我想要传递到现有文件(如 .js、.css 等)的路由。所以我最终得到了一些东西像这样:

public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
            routes.IgnoreRoute("*.js|css|swf");
            routes.RouteExistingFiles = true;

            routes.MapRoute(
               "VirtualTourConfig",
               "virtualtour/config.xml",
               new { controller = "VirtualTour", action = "Config" }
               );
}

如果有人有更好的解决方案,我想看看。我更愿意有选择地将“RouteExistingFIles”标志应用于各个路线,但我不知道是否有办法做到这一点。

【讨论】:

    【解决方案2】:

    这里没有解决方案,只是一个想法。

    您可以尝试基于您自己的 VirtualPathProvider 实施解决方案,该解决方案将提供您自己的 Web 路径到文件系统路径的映射,并对您不想处理的所有路径使用默认提供程序。

    【讨论】:

      【解决方案3】:

      一个非常简单的解决方案,当然,如果您考虑 Scott 的回答,例如:routes.IgnoreRoute("templates/*.html");routes.IgnoreRoute("scripts/*.js");routes.IgnoreRoute("styles/*.css");

      这使您既可以简单地为 RoutesCollection 提供路径,又可以避免必须启动的工作,例如。一个 VirtualPathProvider。

      【讨论】:

        【解决方案4】:

        你可以试试UrlRewiting 例如:

        <configuration>
          <system.webServer>
            <rewrite>
              <rules>
                <rule name="VirtualTourConfig">
                  <match url="^virtualtour/config.xml" />
                  <action type="Rewrite" url="virtualtour/config" />
                </rule>
              </rules>
            </rewrite>
        

        注意,我将其用于不同的用例(即从 asp.net MVC 提供 Angular 应用程序)- 我尚未测试 MVC 路由是否在 url 重写之后发生。

        在我的情况下,我有一个普通的 MVC 路由(即 /Dashboard/ => DashboardController.Index()),但需要 Views/Dashboard/Index.cshtml 中的所有相对路径来提供静态文件而不会被 MVC 路由混淆,即 /Dashboard/app/app.module.js 必须提供静态文件。我使用 UrlRewriting 将/Dashboard/(.+) 映射到/ng/Dashboard/{R:1} 如下:

        <configuration>
          <system.webServer>
            <rewrite>
              <rules>
                <rule name="Dashboard">
                  <match url="^dashboard/(.+)" />
                  <action type="Rewrite" url="ng/dashboard/{R:1}" />
                </rule>
              </rules>
            </rewrite>
        

        【讨论】:

          猜你喜欢
          • 2012-01-08
          • 2016-06-05
          • 1970-01-01
          • 1970-01-01
          • 2022-11-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多