我正在尝试创建一个标题为
的网址的路由http://mysite.com/tech/
但我在网站下面还有一个实际目录,即/ tech,其中包含其他静态资源。不是我的设计选择,但我正在将一个旧网站迁移到mvc并且不想破坏一堆非常旧的链接。
我的路线似乎一直在失败,而我能想到的是服务器看到这个目录并试图从中提供默认文件......但是没有找到,并且它失败了。
我希望使用我的路线,让我提供我的观点。这方面的最佳做法是什么?
更新: 我尝试使用RouteExistingFiles = true,这使得这个工作,但后来我遇到了这些目录中存在的文件的问题。 (例如:http://mysite.com/tech/image.jpg)。我开始为我想要忽略的所有各种文件类型添加IgnoreRoute条目(即.jpg文件..),但这变成了一个大混乱。还有更好的方法吗?
答案 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());