52

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

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

4

8 回答 8

79

自己找到了答案。

理查德·丁沃尔 (Richard Dingwall ) 有一篇出色的文章,介绍了各种策略。我特别喜欢 FilterAttribute 解决方案。我不喜欢随意抛出异常,所以我会看看我是否可以改进:)

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

routes.MapRoute(
    "404-PageNotFound",
    "{*url}",
    new { controller = "StaticContent", action = "PageNotFound" }
    );
于 2008-11-22T00:38:32.987 回答
20

这个问题首先出现,但更简单的答案出现在后面的问题中:

自定义 ASP.NET MVC 404 错误页面的路由

我通过创建返回本文中的视图的 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>
于 2011-09-21T14:47:36.580 回答
7

您也可以在 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
    }
}
于 2016-03-06T11:06:27.967 回答
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>

于 2015-02-18T06:39:31.207 回答
3

这可能是您使用时的问题

throw new HttpException(404);

当你想抓住它时,我不知道还有什么其他方法可以编辑你的网络配置。

于 2008-11-22T19:46:01.737 回答
1

创建包罗万象的路线的另一种方法是Application_EndRequest向您的MvcApplicationper Marco's Better-Than-Unicorns MVC 404 Answer添加一个方法。

于 2012-08-24T21:02:09.967 回答
1

在里面RouterConfig.cs添加以下代码:

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

           });
于 2015-10-07T07:04:38.520 回答
0

如果无法解析路由,则 MVC 框架将通过 404 错误.. 最好的方法是使用异常过滤器...创建自定义异常过滤器并像这样..

public class RouteNotFoundAttribute : FilterAttribute, IExceptionFilter {
    public void OnException(ExceptionContext filterContext) {
        filterContext.Result  = new RedirectResult("~/Content/RouteNotFound.html");
   }
}
于 2015-05-18T13:25:48.137 回答