如果未找到动态内容,则正确地将用户发送到404(ASP.NET MVC)

Joh*_*lip 3 c# asp.net-mvc http-status-code-404 asp.net-mvc-3

我已经为ASP.NET MVC 3中的一般情况实现了404处理,因为没有找到控制器/视图.但是,如果用户试图访问无法找到的内容,应如何在控制器内部进行处理?例如www.foo.bar/Games/Details/randomjunk将在里面调用GamesController:

public ActionResult Details(string id) // id is 'randomjunk'
{
  if(DoesGameExist(id) == false)
    // Now what?
Run Code Online (Sandbox Code Playgroud)

我可以做一个,return Redirect('/Errors/Http404');但这似乎不是正确的方法.你应该抛出异常还是别的什么?

在这种情况下我们可以有一个特殊的观点,但首先我们需要一个很好的方法来应用于几个案例.

编辑:我想展示我已经拥有的友好404页面的一般情况.

Ant*_*ula 9

你应该抛出HttpException 404:

throw new HttpException(404, "Page not Found");
Run Code Online (Sandbox Code Playgroud)


Mat*_*hen 5

编辑:显然每个达林迪米特罗夫,我以前所拥有的甚至不起作用customErrors.正如Antonio Bakula 在另一个答案中所说,你必须这样做:

throw new HttpException(404, "Not found")
Run Code Online (Sandbox Code Playgroud)

然后customErrors将起作用.

有一个内置的辅助方法,HttpNotFound所以你可以这样做:

return HttpNotFound();

您还可以使用HttpStatusCodeResult显式返回404:

返回新的HttpStatusCodeResult(404);

HttpStatusCodeResult 当没有特定的帮助方法或类所需的代码时,它会很有用.

你也应该在你的Web.config中有这个:

<customErrors>
    <error statusCode="404" redirect="~/Custom404Page.html"/>
</customErrors>
Run Code Online (Sandbox Code Playgroud)

您还可以为其他状态添加其他行,以及a defaultRedirect.

  • 这个?<customErrors mode ="On"defaultRedirect ="GenericErrorPage.html"> <error statusCode ="404"redirect ="/ Errors/Http404"/> </ customErrors> (2认同)