2010-06-01 11 views
116

Tengo una acción que toma una cadena que se utiliza para recuperar algunos datos. Si esta cadena da como resultado que no se devuelvan datos (tal vez porque se ha eliminado), quiero devolver un 404 y mostrar una página de error.Cómo obtener la acción MVC para devolver 404

Actualmente solo uso return a special view que muestra un mensaje de error amigable específico para esta acción diciendo que el artículo no se encontró. Esto funciona bien, pero lo ideal sería devolver un código de estado 404 para que los motores de búsqueda sepan que este contenido ya no existe y pueden eliminarlo de los resultados de búsqueda.

¿Cuál es la mejor manera de hacerlo?

¿Es tan simple como establecer Response.StatusCode = 404?

+0

También debe mantener Response.TrySkipIisCustomErrors = true; La respuesta de @ganders fue un salvavidas ... – Thunder

Respuesta

86

Hay varias maneras de hacerlo,

  1. que está justo en código aspx común que se puede asignar en su forma especificada
  2. throw new HttpException(404, "Some description");
+1

Una cosa a tener en cuenta es que si tiene una página CustomError configurada para manejar 404, esta página de error devolverá 200 (la página no encontrada fue encontrada ...: .. - (+) tiendo a emitir la excepción de decir BlogController y tiene la acción NotFound establece el código de respuesta adecuada –

+19

que terminé haciendo: Response.StatusCode = 404; Response.TrySkipIisCustomErrors = true; retorno Ver ("MyCustomView"); Esto funciona perfectamente en mi situación. –

+0

@PaulHiles: Esta es la respuesta para mí en MVC3. Ojalá pudiera decirlo como una respuesta en lugar de un comentario. –

2

que utilizo:

Response.Status = "404 NotFound"; 

Esto funciona para mí :-)

5

En NerdDinner, por ejemplo. Trato de it

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

Gracias, pero detrás de escena, que arroja una HttpException similar a la sugerencia número dos en la publicación de Dewfy. Estoy buscando un poco más de control para poder mostrar una página de error agradable específica para la acción, no solo redireccionando a la página del controlador/global 404. Parece que establecer el código de estado y volver a una vista personalizada es el camino a seguir para mi situación. –

9

He utilizado este:

Response.StatusCode = 404; 
return null; 
+0

Gracias. Esto se ve mucho mejor que lanzar una costosa excepción en el servidor. Me pregunto si el 404 se registraría en los registros de IIS ... idealmente lo sería. – fozylet

+1

Pero, en asp.net, este método no es una buena solución, ¿verdad? ya que la página web mostraría toda la información confidencial relacionada del servidor. – lzlstyle

+0

Una excepción tomará menos de un milisegundo en manejar. Comparado con los pocos cientos de milisegundos solo para hacer una conexión HTTP hacia arriba y hacia atrás no tiene sentido. lanza HttpException o devuelve HttpNotFoundResult, configurando manualmente el código de estado y devolver null es terrible. – George

22

Código:

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

Web.config

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

Además, todos los códigos de estado disponibles existen en esta enumeración: HttpStatusCode. – user2173353

135

En ASP.NET MVC 3 y superior puede devolver HttpNotFoundResult desde el controlador.

return new HttpNotFoundResult("optional description"); 
+4

uso: 'return new HttpNotFoundResult (" descripción opcional ");' –

+3

Si regresa desde el controlador también hay un método de conveniencia llamado 'HttpNotFound()'. Por lo tanto, podría devolver 'return HttpNotFound (" descripción opcional ")' en su lugar. –

+0

Cosas que no fueron tan prácticas en 2012 ;-) –

51

En MVC 4 y arriba se puede utilizar el incorporado en HttpNotFound métodos auxiliares:

if (notWhatIExpected) 
{ 
    return HttpNotFound(); 
} 

o

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

Ninguno de los ejemplos anteriores trabajó para mí hasta que he añadido el línea media a continuación:

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

¿En serio me está diciendo que el simple 'return HttpNotFound();' no funcionó para usted? ¿Qué edad tiene tu sistema? –

+0

.NET 4.5, MVC 4 – ganders

+1

¿Intentó 'devolver HttpNotFound();'? Funciona bien con MVC 4 hacia arriba. http://msdn.microsoft.com/en-us/library/system.web.httpresponse.tryskipiiscustomerrors(v=vs.110).aspx "La propiedad TrySkipIisCustomErrors solo se usa cuando su aplicación está alojada en IIS 7.0. Cuando se ejecuta en el modo Clásico en IIS 7.0, el valor predeterminado de la propiedad TrySkipIisCustomErrors es verdadero. Cuando se ejecuta en modo integrado, el valor predeterminado de la propiedad TrySkipIisCustomErrors es falso. " –

-1

Por favor, intente el siguiente código de demostración:

public ActionResult Test() 

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

También puede hacer:

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

Si está trabajando con .NET Core, puede return NotFound()

1

En.NET Core 1.1:

return new NotFoundObjectResult(null); 
+1

Si no devuelve un objeto, entonces devolver NotFound() es más apropiado, pero en cualquier caso, no obtendrá una página de error amigable a menos que lo maneje con algo como StatusCodePagesWithReExecute. Ver https://www.devtrends.co.uk/blog/handling-404-not-found-in-asp.net-core –

Cuestiones relacionadas