Как заставить MVC action вернуть 404 - PullRequest
130 голосов
/ 01 июня 2010

У меня есть действие, которое принимает строку, которая используется для получения некоторых данных. Если эта строка не возвращает данных (возможно, потому что они были удалены), я хочу вернуть 404 и отобразить страницу с ошибкой.

В настоящее время я просто использую функцию возврата специального представления, в котором отображается понятное сообщение об ошибке, относящееся к этому действию, в котором говорится, что элемент не найден. Это работает нормально, но в идеале хотелось бы вернуть код состояния 404, чтобы поисковые системы знали, что этот контент больше не существует, и могут удалить его из результатов поиска.

Как лучше всего это сделать?

Это так же просто, как установить Response.StatusCode = 404?

Ответы [ 12 ]

144 голосов
/ 01 февраля 2012

В ASP.NET MVC 3 и выше вы можете вернуть HttpNotFoundResult из контроллера.

return new HttpNotFoundResult("optional description");
102 голосов
/ 01 июня 2010

Есть несколько способов сделать это,

  1. Вы правы в общем aspx-коде, который может быть назначен указанным вами способом
  2. throw new HttpException(404, "Some description");
56 голосов
/ 10 июля 2013

В MVC 4 и выше вы можете использовать встроенные вспомогательные методы HttpNotFound:

if (notWhatIExpected)
{
    return HttpNotFound();
}

или

if (notWhatIExpected)
{
    return HttpNotFound("I did not find message goes here");
}
24 голосов
/ 28 октября 2011

Код:

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

Web.config

<customErrors mode="On">
  <error statusCode="404" redirect="/Home/NotFound" />
</customErrors>
12 голосов
/ 20 июня 2011

Я использовал это:

Response.StatusCode = 404;
return null;
6 голосов
/ 14 августа 2016

Если вы работаете с .NET Core, вы можете return NotFound()

5 голосов
/ 01 июня 2010

В NerdDinner, например. Попробуйте это

public ActionResult Details(int? id) {
    if (id == null) {
        return new FileNotFoundResult { Message = "No Dinner found due to invalid dinner id" };
    }
    ...
}
4 голосов
/ 25 сентября 2014

Ни один из приведенных выше примеров не работал для меня, пока я не добавил среднюю строку ниже:

public ActionResult FourOhFour()
{
    Response.StatusCode = 404;
    Response.TrySkipIisCustomErrors = true; // this line made it work
    return View();
}
2 голосов
/ 01 июня 2010

Я использую:

Response.Status = "404 NotFound";

Это работает для меня: -)

1 голос
/ 16 мая 2017

В .NET Core 1.1:

return new NotFoundObjectResult(null);
...