如何让MVC动作返回404

时间:2010-06-01 09:14:16

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

我有一个动作,它接受一个用于检索某些数据的字符串。如果此字符串导致没有返回数据(可能因为它已被删除),我想返回404并显示错误页面。

我目前只是使用返回一个特殊视图,该视图显示特定于此操作的友好错误消息,指出未找到该项目。这很好,但理想情况下会返回404状态代码,以便搜索引擎知道此内容不再存在,并可以将其从搜索结果中删除。

最好的方法是什么?

是否像设置Response.StatusCode = 404一样简单?

12 个答案:

答案 0 :(得分:143)

在ASP.NET MVC 3及更高版本中,您可以从控制器返回HttpNotFoundResult

return new HttpNotFoundResult("optional description");

答案 1 :(得分:101)

有多种方法可以做到,

  1. 您可以使用指定的方式分配常见的aspx代码
  2. throw new HttpException(404, "Some description");

答案 2 :(得分:56)

在MVC 4及更高版本中,您可以使用内置的HttpNotFound辅助方法:

if (notWhatIExpected)
{
    return HttpNotFound();
}

if (notWhatIExpected)
{
    return HttpNotFound("I did not find message goes here");
}

答案 3 :(得分:24)

代码:

if (id == null)
{
  throw new HttpException(404, "Your error message");//RedirectTo NoFoundPage
}

<强>的Web.config

<customErrors mode="On">
  <error statusCode="404" redirect="/Home/NotFound" />
</customErrors>

答案 4 :(得分:11)

我用过这个:

Response.StatusCode = 404;
return null;

答案 5 :(得分:6)

如果您使用的是.NET Core,则可以return NotFound()

答案 6 :(得分:5)

在NerdDinner中,例如。试试it

public ActionResult Details(int? id) {
    if (id == null) {
        return new FileNotFoundResult { Message = "No Dinner found due to invalid dinner id" };
    }
    ...
}

答案 7 :(得分:4)

在我添加下面的中间行之前,以上所有示例都不适用于我:

public ActionResult FourOhFour()
{
    Response.StatusCode = 404;
    Response.TrySkipIisCustomErrors = true; // this line made it work
    return View();
}

答案 8 :(得分:2)

我用:

Response.Status = "404 NotFound";

这对我有用: - )

答案 9 :(得分:1)

在.NET Core 1.1中:

return new NotFoundObjectResult(null);

答案 10 :(得分:0)

你也可以这样做:

        if (response.Data.IsPresent == false)
        {
            return StatusCode(HttpStatusCode.NoContent);
        }

答案 11 :(得分:-1)

请尝试以下演示代码:

public ActionResult Test()

{
  return new HttpStatusCodeResult (404,"Not found");
}