Как получить действие MVC для возврата 404

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

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

каков наилучший способ сделать это?

Это так же просто, как настройка ответа.Значения statusCode = 404?

12 ответов


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

  1. вы правы в общем коде aspx, он может быть назначен указанным Вами способом
  2. throw new HttpException(404, "Some description");

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

return new HttpNotFoundResult("optional description");

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

if (notWhatIExpected)
{
    return HttpNotFound();
}

или

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

код :

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

Web.config

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

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

Response.StatusCode = 404;
return null;

в NerdDinner например. Попробуй!--2-->это

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

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


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

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

Я использую:

Response.Status = "404 NotFound";

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


в .NET Core 1.1:

return new NotFoundObjectResult(null);

вы также можете сделать:

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

пожалуйста, попробуйте следующий код:

public ActionResult Test()

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