我注意到一个SO答案暗示or-delimited matches for IgnoreRoute,如下:
routes.IgnoreRoute("*.js|css|swf");
当我试一试时,它失败了。我不得不将建议的一行代码转换成多行,如下所示:
routes.IgnoreRoute("Javascript/{*catchall}");
routes.IgnoreRoute("Content/{*catchall}");
routes.IgnoreRoute("Scripts/{*catchall}");
实际上是否有更简洁的方式来表达文件的豁免(例如css,javascript等)?另外,我想知道原始链接是否真的错了,或者我只是错过了什么。
是的,请假设我需要routes.RouteExistingFiles = true
答案 0 :(得分:2)
我想出了一个更简单的方法:
routes.RouteExistingFiles = true;
routes.IgnoreRoute("{*relpath}", new { relpath = @"(.*)?\.(css|js|htm|html)" });
无需担心跟踪http查询字符串,因为System.Web.Routing.Route类在评估期间已将该部分剥离。
有趣的是,Route.GetRouteData(...)中的代码将采用提供的正则表达式约束,并添加“开始”和“结束”行要求,如下所示:
string str = myRegexStatementFromAbove;
string str2 = string.Concat("^(", str, ")$");
这就是为什么我写的正则表达式如果仅仅写成:
就不起作用routes.IgnoreRoute("{*relpath}", new { relpath = @"\.(css|js|htm|html)" });
答案 1 :(得分:1)
我不确定您是否可以在一行中指定所有这些内容。另一种方法是您可以创建自定义路由约束并完全忽略这些文件夹/ 文件。
<强>更新强>
根据 @Brent 的反馈,检查pathinfo
比比较folder
更好。
public class IgnoreConstraint : IRouteConstraint
{
private readonly string[] _ignoreList;
public IgnoreConstraint(params string[] ignoreList)
{
_ignoreList = ignoreList;
}
public bool Match(System.Web.HttpContextBase httpContext, Route route, string parameterName,
RouteValueDictionary values, RouteDirection routeDirection)
{
return _ignoreList.Contains(Path.GetExtension(values["pathinfo"].ToString()));
}
}
<强>的Global.asax.cs 强>
routes.IgnoreRoute("{*pathInfo}", new { c =
new IgnoreConstraint(".js", ".css") });
routes.RouteExistingFiles = true;
=============================================== =================================
以前的代码
public class IgnoreConstraint: IRouteConstraint
{
private readonly string[] _ignoreArray;
public IgnoreConstraint(params string[] ignoreArray)
{
_ignoreArray = ignoreArray;
}
public bool Match(System.Web.HttpContextBase httpContext, Route route, string parameterName,
RouteValueDictionary values, RouteDirection routeDirection)
{
var folder = values["folder"].ToString().ToLower();
return _ignoreArray.Contains(folder);
}
}
在Global.asax.cs
routes.IgnoreRoute("{folder}/{*pathInfo}", new { c =
new IgnoreConstraint("content", "script") });
routes.RouteExistingFiles = true;