当文件实际存在于指定位置时的MVC路由

时间:2011-01-13 15:30:39

标签: c# asp.net-mvc routing

所以我在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文件,而无需为每个静态资产专门设置路由。那么现在的问题是,有没有办法在每个路由的基础上做到这一点?

4 个答案:

答案 0 :(得分:6)

到目前为止,我发现的最佳答案是全局应用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”标志应用于各个路线,但我不知道是否有办法做到这一点。

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

一个非常简单的解决方案,当然如果你考虑斯科特的答案,那就是:routes.IgnoreRoute("templates/*.html");routes.IgnoreRoute("scripts/*.js");routes.IgnoreRoute("styles/*.css");

这为您提供了仅提供RoutesCollection路径的简单性,并避免了必须启动例如的工作。 VirtualPathProvider。

答案 3 :(得分:0)

您可以尝试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提供角度应用程序) - 我还没有测试过网址重写后是否发生了MVC路由。

在我的情况下,我有一个正常的MVC路由(即/Dashboard/ =&gt; 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>