路径存在的MVC路由

时间:2011-08-27 19:55:19

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

我正在尝试创建一个标题为

的网址的路由
http://mysite.com/tech/

但我在网站下面还有一个实际目录,即/ tech,其中包含其他静态资源。不是我的设计选择,但我正在将一个旧网站迁移到mvc并且不想破坏一堆非常旧的链接。

我的路线似乎一直在失败,而我能想到的是服务器看到这个目录并试图从中提供默认文件......但是没有找到,并且它失败了。

我希望使用我的路线,让我提供我的观点。这方面的最佳做法是什么?

更新: 我尝试使用RouteExistingFiles = true,这使得这个工作,但后来我遇到了这些目录中存在的文件的问题。 (例如:http://mysite.com/tech/image.jpg)。我开始为我想要忽略的所有各种文件类型添加IgnoreRoute条目(即.jpg文件..),但这变成了一个大混乱。还有更好的方法吗?

1 个答案:

答案 0 :(得分:14)

您需要将RouteCollections对象的RouteExistingFiles属性设置为true。如果发现冲突,这将使您的路由覆盖物理位置。

routes.MapRoute("Default", "{controller}/{action}/{id}",
        new { controller = "Home", action = "Index", id = "" }
    );
routes.RouteExistingFiles = true;

要有选择地忽略您可以使用的文件/扩展程序:

routes.IgnoreRoute("{*staticfile}", new { staticfile = @".*\.(css|js|gif|jpg)(/.*)?" });

如果您不喜欢ignoreRoute方法,另一种可能有用的方法是扩展ViewEngine并使用您自己的规则覆盖文件存在实现。

public class MyViewEngine : RazorViewEngine
{
    protected override bool FileExists(ControllerContext controllerContext, string virtualPath)
    {
        //Some Logic to check for file
    }
}

ViewEngines.Engines.Clear();
ViewEngines.Engines.Add(new CustomViewEngine());