如何在asp.net mvc视图中返回404错误

31

我该如何实现以下功能?

我的控制器

if (something == null)
{         
     //return the view with 404 http header
     return View();          
}

  //return the view with 200 http header
  return View();

1
返回一个404视图没有任何意义。 404是页面未找到的状态代码。 同时返回页面就很奇怪了。 如果这样做,可能会导致浏览器不一致性。 - Liam
6个回答

45

只要写就好了

Response.StatusCode = 404;

在返回视图之前。


6
这正是 return HttpNotFound(); 在内部所做的。它向当前的 HttpContext 响应中添加了 404 StatusCode 和 StatusDescription。 - levelnis
1
@levelnis 这个命令的区别在于它不像 return 一样结束函数。顺便说一下:Alan Low 的回答和我的完全相同,而且它被点赞可能有原因... - fero
1
谢谢你的回答!为了满足我的需求,我必须将以下内容添加到我的Web配置文件中:<system.webServer> <httpErrors errorMode="Detailed"> <remove statusCode="404"/> </httpErrors> </system.webServer> - user1615362

17
if (something == null)
{         
   return new HttpNotFoundResult(); // 404
}
else
{
   return new HttpStatusCodeResult(HttpStatusCode.OK); // 200
}

2
问题不在于如何返回 404,而在于如何使用 404 HTTP 标头返回相同的页面。 - user1615362
2
如果你仔细想一下,每个对Web服务器的请求都只是返回一个带有状态码的响应。如果状态码是200,通常会有一些HTML与之相关,我们认为这是一个页面,但就服务器而言,它只是一个状态码,无论是200、404等。 - levelnis
FYI new EmptyResult()new HttpStatusCodeResult(HttpStatusCode.OK) 是相同的。 - Erik Philips

10
if (something == null)
{         
    Response.StatusCode = (int)HttpStatusCode.NotFound;
    return View();          
}

//return the view with 200 http header
return View();

1
那么,为什么要第一个return,因为第二个也会返回。 - Dave Van den Eynde
在这个例子中,我同意只需要最后一个返回。然而,我做了一个假设,即如果“something”不是null,那么在空检查之后可能还有一些额外的代码是相关的。 - Alan Low
正如我在问题中所述,返回视图和404状态码是奇怪的行为。我不建议这样做(即使OP要求这样做)。 - Liam

9
你应该将ResponseTrySkipIisCustomErrors属性设置为true
public ActionResult NotFound()
{
    Response.StatusCode = 404;
    Response.TrySkipIisCustomErrors = true;
    return View();
}

2
根据我的情况,最好的答案是允许返回任意视图而不是服务器接管并显示默认的404响应。 - rdans

2
if (something == null)
{         
   return HttpNotFound();
}

return View();

与上面一样,您会注意到此处未返回视图。 - Nick Bailey

1

我会抛出一个404异常,并创建一个自定义异常过滤器,用于返回404错误的未找到页面。内置的HandleError过滤器无法处理404错误。

if (something == null)
{         
   throw new HttpException(404, "Not found")
}

return View();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接