Ich habe eine Aktion, die eine Zeichenfolge übernimmt, die zum Abrufen einiger Daten verwendet wird. Wenn diese Zeichenfolge dazu führt, dass keine Daten zurückgegeben werden (möglicherweise, weil sie gelöscht wurden), möchte ich eine 404 zurückgeben und eine Fehlerseite anzeigen.
Ich verwende derzeit nur die Rückgabe einer speziellen Ansicht, in der eine benutzerfreundliche Fehlermeldung speziell für diese Aktion angezeigt wird, die besagt, dass das Element nicht gefunden wurde. Dies funktioniert einwandfrei, möchte aber im Idealfall einen 404-Statuscode zurückgeben, damit Suchmaschinen wissen, dass dieser Inhalt nicht mehr vorhanden ist, und ihn aus den Suchergebnissen entfernen können.
Was ist der beste Weg, um dies zu tun?
Ist es so einfach wie das Setzen von Response.StatusCode = 404?
Es gibt mehrere Möglichkeiten, dies zu tun.
throw new HttpException(404, "Some description");
In ASP.NET MVC 3 und höher können Sie ein HttpNotFoundResult vom Controller zurückgeben.
return new HttpNotFoundResult("optional description");
In MVC 4 und höher können Sie die integrierten Hilfsmethoden HttpNotFound
verwenden:
if (notWhatIExpected)
{
return HttpNotFound();
}
oder
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>
Ich habe das benutzt:
Response.StatusCode = 404;
return null;
Wenn Sie mit .NET Core arbeiten, können Sie return NotFound()
In NerdDinner zB. Versuchen Sie es
public ActionResult Details(int? id) {
if (id == null) {
return new FileNotFoundResult { Message = "No Dinner found due to invalid dinner id" };
}
...
}
Keines der obigen Beispiele hat für mich funktioniert, bis ich die mittlere Zeile unten hinzugefügt habe:
public ActionResult FourOhFour()
{
Response.StatusCode = 404;
Response.TrySkipIisCustomErrors = true; // this line made it work
return View();
}
Ich benutze:
Response.Status = "404 NotFound";
Das funktioniert bei mir :-)
In .NET Core 1.1:
return new NotFoundObjectResult(null);
Sie können auch tun:
if (response.Data.IsPresent == false)
{
return StatusCode(HttpStatusCode.NoContent);
}