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?
Il y a plusieurs façons de le faire,
throw new HttpException(404, "Some description");
Dans ASP.NET MVC 3 et versions ultérieures, vous pouvez renvoyer un HttpNotFoundResult à partir du contrôleur.
return new HttpNotFoundResult("optional description");
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");
}
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>
J'ai utilisé ceci:
Response.StatusCode = 404;
return null;
Si vous travaillez avec .NET Core, vous pouvez return NotFound()
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" };
}
...
}
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();
}
J'utilise:
Response.Status = "404 NotFound";
Cela fonctionne pour moi :-)
Dans .NET Core 1.1:
return new NotFoundObjectResult(null);
Vous pouvez aussi faire:
if (response.Data.IsPresent == false)
{
return StatusCode(HttpStatusCode.NoContent);
}