路径存在的MVC路由

Bra*_*itz 9 c# asp.net-mvc asp.net-mvc-routing

我正在尝试创建一个标题为url的路由

http://mysite.com/tech/
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

The*_*ing 14

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

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

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

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

如果您不喜欢这种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());
Run Code Online (Sandbox Code Playgroud)