在Asp.net MVC中抛出/返回404 actionresult或异常并让IIS处理它

CVe*_*tex 47 asp.net-mvc iis-7 http

如何从我的操作中抛出404或FileNotFound异常/结果并让IIS使用我的customErrors配置部分来显示404页面?

我已经定义了我的customErrors

<customErrors mode="On" defaultRedirect="/trouble">
  <error statusCode="404" redirect="/notfound" />
</customErrors>
Run Code Online (Sandbox Code Playgroud)

我第一次试图尝试添加这个的actionResult不起作用.

public class NotFoundResult : ActionResult {
    public NotFoundResult() {

    }

    public override void ExecuteResult(ControllerContext context) {
        context.HttpContext.Response.TrySkipIisCustomErrors = false;
        context.HttpContext.Response.StatusCode = 404;
    }
}
Run Code Online (Sandbox Code Playgroud)

但这只是显示一个空白页而不是我/未找到的页面

:(

我该怎么办?

Rob*_*ine 133

ASP.NET MVC 3引入了HttpNotFoundResult操作结果,该结果应优先用于使用http状态代码手动抛出异常.这也可以通过控制器上的Controller.HttpNotFound方法返回:

public ActionResult MyControllerAction()
{
   ...

   if (someNotFoundCondition)
   {
       return HttpNotFound();
   }
}
Run Code Online (Sandbox Code Playgroud)

在MVC 3之前,您必须执行以下操作:

throw new HttpException(404, "HTTP/1.1 404 Not Found");
Run Code Online (Sandbox Code Playgroud)

  • 是的 - 但是HttpNotFound是在ASP.NET MVC 3中引入的.这个问题(以及我的回答)在早期版本之前是适当的方法.我现在编辑了我的答案,以说明在MVC3中首选的新方法. (9认同)
  • 拉德.投票支持你. (4认同)
  • 此外,例如,当您想要为action参数创建short,void和可重用的null检查方法时,抛出异常仍然是合理的. (2认同)