web-dev-qa-db-fra.com

Comment obtenir une action de MVC pour retourner 404

J'ai une action qui prend une chaîne qui est utilisée pour récupérer des données. Si cette chaîne ne renvoie aucune donnée (peut-être parce qu'elle a été supprimée), je souhaite renvoyer un 404 et afficher une page d'erreur.

Actuellement, je viens juste d’utiliser return une vue spéciale qui affiche un message d’erreur spécifique à cette action indiquant que l’élément n’a pas été trouvé. Cela fonctionne bien, mais souhaiterait idéalement renvoyer un code d'état 404 afin que les moteurs de recherche sachent que ce contenu n'existe plus et qu'il peut le supprimer des résultats de la recherche.

Quelle est la meilleure manière de s'occuper de ça?

Est-ce aussi simple que de définir Response.StatusCode = 404?

134
Paul Hiles

Il y a plusieurs façons de le faire,

  1. Vous avez raison dans le code aspx commun, il peut être affecté de la manière spécifiée
  2. throw new HttpException(404, "Some description");
104
Dewfy

Dans ASP.NET MVC 3 et versions ultérieures, vous pouvez renvoyer un HttpNotFoundResult à partir du contrôleur.

return new HttpNotFoundResult("optional description");
144
Stefan Paul Noack

Dans MVC 4 et les versions ultérieures, vous pouvez utiliser les méthodes d'assistance intégrées HttpNotFound:

if (notWhatIExpected)
{
    return HttpNotFound();
}

ou

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

Code:

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

Web.config

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

J'ai utilisé ceci:

Response.StatusCode = 404;
return null;
12
Wout

Si vous travaillez avec .NET Core, vous pouvez return NotFound()

8
Robert Paulsen

Dans NerdDinner par exemple. Essayez it

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

Aucun des exemples ci-dessus n'a fonctionné pour moi jusqu'à ce que j'ai ajouté la ligne médiane ci-dessous:

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

J'utilise:

Response.Status = "404 NotFound";

Cela fonctionne pour moi :-)

2
bruno

Dans .NET Core 1.1:

return new NotFoundObjectResult(null);
1
feedthedogs

Vous pouvez aussi faire:

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