我的路由有问题。我试图阻止404错误结束我的自定义routeconstraint。
这是我的一些路线:
routes.IgnoreRoute("Content/{*pathInfo}");
routes.IgnoreRoute("{*allfiles}", new { allfiles = @".*\.(css|js|gif|jpg|png)" });
routes.MapRoute(
name: "MenuRoute",
url: "{*permalink}",
defaults: new { controller = "Menu", action = "Index" },
constraints: new { permalink = new MenuUrlConstraint() }
);
我的问题是每次出现静态文件的404时,都会转到我的MenuRoute。
我有办法避免这种情况发生吗?
或者是在我的routeconstraint中检查404的唯一解决方案,如果是这样的话什么都不做?
----- ---- EDIT
public class MenuUrlConstraint : IRouteConstraint
{
public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection)
{
var db = new ApplicationDbContext();
var permalink = values[parameterName] != null ? values[parameterName].ToString() : "";
return db.MenuItems.Any(p => p.Url == permalink && p.Published == true);
}
}
答案 0 :(得分:0)
路由就像c#
中的switch case语句一样工作。如果路由约束返回true,则会导致路由使用当前路由,而不检查其后配置的任何路由。
所以,是的,一个可能的解决方案是使用一个保护条款来确保404状态永远不会返回true。
if (httpContext.Response.StatusCode == 404) return false;
可能有更好的解决方案来确保您的路线约束仅在您需要时返回true,但由于您没有发布代码,我无法提供建议。