如何捕获所有路由来处理ASP.NET MVC的'404 page not found'查询?

时间:2008-11-21 23:53:50

标签: asp.net-mvc routes http-status-code-404

是否有可能创建一个捕获所有的最终路由...并将用户弹回到ASP.NET MVC中的404视图?

注意:我不想在我的IIS设置中设置它。

8 个答案:

答案 0 :(得分:72)

自己找到答案。

Richard Dingwall有一个很好的帖子,通过各种策略。我特别喜欢FilterAttribute解决方案。我不喜欢在willy nilly周围抛出异常,所以我会看看我是否可以改进:)

对于global.asax,只需添加此代码作为注册的最后一条路径:

routes.MapRoute(
    "404-PageNotFound",
    "{*url}",
    new { controller = "StaticContent", action = "PageNotFound" }
    );

答案 1 :(得分:19)

这个问题首先出现了,但后来的问题更容易得到答案:

Routing for custom ASP.NET MVC 404 Error page

  

我通过创建一个ErrorController让我的错误处理工作   返回本文中的视图。我还要添加“Catch All”   到global.asax中的路由。

     

如果没有,我看不出它会如何到达这些错误页面   在Web.config ..?我的Web.config必须指定:

customErrors mode="On" defaultRedirect="~/Error/Unknown"
     

然后我还补充道:

error statusCode="404" redirect="~/Error/NotFound"
     

希望这有帮助。

我现在喜欢这种方式,因为它很简单:

 <customErrors mode="On" defaultRedirect="~/Error/" redirectMode="ResponseRedirect">
    <error statusCode="404" redirect="~/Error/PageNotFound/" />
 </customErrors>

答案 2 :(得分:4)

在项目根目录web.config文件下添加此行。

 <system.webServer>
<httpErrors errorMode="Custom" existingResponse="Replace">
  <remove statusCode="404" />
  <error statusCode="404" responseMode="ExecuteURL" path="/Test/PageNotFound" />
  <remove statusCode="500" />
  <error statusCode="500" responseMode="ExecuteURL" path="/Test/PageNotFound" />
</httpErrors>
<modules>
  <remove name="FormsAuthentication" />
</modules>

答案 3 :(得分:4)

你也可以在Global.asax.cs中处理NOT FOUND错误,如下所示

protected void Application_Error(object sender, EventArgs e)
{
    Exception lastErrorInfo = Server.GetLastError();
    Exception errorInfo = null;

    bool isNotFound = false;
    if (lastErrorInfo != null)
    {
        errorInfo = lastErrorInfo.GetBaseException();
        var error = errorInfo as HttpException;
        if (error != null)
            isNotFound = error.GetHttpCode() == (int)HttpStatusCode.NotFound;
    }
    if (isNotFound)
    {
        Server.ClearError();
        Response.Redirect("~/Error/NotFound");// Do what you need to render in view
    }
}

答案 4 :(得分:3)

使用

时可能会出现问题
throw new HttpException(404);

当你想要捕获它时,我不知道编辑你的web配置的任何其他方式。

答案 5 :(得分:1)

创建全能路线的另一种方法是在每Marco's Better-Than-Unicorns MVC 404 Answer Application_EndRequest MvcApplication的基础上添加{{1}}方法。

答案 6 :(得分:1)

RouterConfig.cs内添加以下代码:

  routes.MapRoute(
           name: "Error",
           url: "{id}",
           defaults: new
           {
               controller = "Error",
               action = "PageNotFound"

           });

答案 7 :(得分:0)

如果路由无法解析,那么MVC框架将通过404错误.. 最好的方法是使用异常过滤器...创建一个自定义的异常过滤器并制作如下..

public class RouteNotFoundAttribute : FilterAttribute, IExceptionFilter {
    public void OnException(ExceptionContext filterContext) {
        filterContext.Result  = new RedirectResult("~/Content/RouteNotFound.html");
   }
}