【问题标题】:ASP MVC routing 404 and images issueASP MVC 路由 404 和图像问题
【发布时间】:2015-08-01 10:42:15
【问题描述】:

我的路由有问题。我试图防止 404 错误最终出现在我的自定义路由约束中。

这是我的一些路线:

        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。

我有办法避免这种情况发生吗?

或者是在我的路由约束中检查 404 的唯一解决方案,如果是,则不执行任何操作?

-----编辑----

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);
    }

}

【问题讨论】:

    标签: c# asp.net-mvc routes


    【解决方案1】:

    路由的工作方式类似于 c# 中的 switch case 语句。如果路由约束返回 true,它会导致路由使用当前路由,并且不检查其后配置的任何路由。

    所以,是的,一个可能的解决方案是使用保护子句来确保 404 状态永远不会返回 true。

    if (httpContext.Response.StatusCode == 404) return false;
    

    可能有更好的解决方案来确保您的路线约束仅在您希望时返回 true,但由于您没有发布代码,我无法提供建议。

    【讨论】:

    • 嗨,当约束已经是 404 时,约束将返回 false。但是,routeconstraint 会检查数据库中的 slug 等。如果图像上的 404 等明显地我不需要:> 正如你所说,我可以在我的约束中做你的建议。我在想,如果设置不同的一般路线或其他什么东西,也许可以避免这种情况?我会在原始问题的 EDIT 中发布我的 routeconstraint。
    猜你喜欢
    • 2015-02-24
    • 2011-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-04
    • 1970-01-01
    • 1970-01-01
    • 2011-11-17
    相关资源
    最近更新 更多