2010-04-04 16 views
5

estoy construyendo mi primer sitio web ASP.NET MVC, y yo estoy tratando de encontrar la manera de poner en práctica una página 404.404 páginas en ASP.NET MVC

¿Debo crear un controlador llamado "404Controller?" Si es así, ¿cómo puedo registrar este Controlador con IIS para que redirija los 404 a esa página? Además, en una situación en la que algo no se encuentra (en la base de datos, por ejemplo) por algún otro código del Controlador, ¿cómo redireccionaría la solicitud a mi página 404?

Respuesta

7

La opción preferida para mí es volver una vista llamada 404.

if (article == null) 
    return View("404"); 

Esto le deja la opción de tener una visión genérica 404 en la carpeta compartida, y una vista específica a 404 el controlador del artículo.

Además, una gran ventaja es que no hay una redirección hacia aquí.

+0

Simple y personalizable, me gusta. –

+0

no te olvides de los eventos no administrados, como las URL incorrectas. probar esta solución: http://stackoverflow.com/questions/619895/how-can-i-properly-handle-404s-in-asp-net-mvc/2577095#2577095 –

+19

Pero esto devuelve el código de estado 200, no 404. –

14

No hay una sola respuesta para lo que estás tratando de hacer, la más simple y lo que me gusta es usar la clase HttpException, p. Ej.

public ActionResult ProductDetails(int id) { 

    Product p = this.repository.GetProductById(id); 

    if (p == null) { 
     throw new HttpException(404, "Not Found"); 
    } 

    return View(p); 
} 

En web.config puede configurar páginas, por ejemplo CustomError

<customErrors mode="RemoteOnly" redirectMode="ResponseRewrite"> 
    <error statusCode="404" redirect="Views/Errors/Http404.aspx" /> 
</customErrors> 
+0

La forma en que IIS maneja los errores me enferma. No me redireccione solo porque escribí la URL incorrectamente. –

+4

@David Murdoch: con 'redirectMode =" ResponseRewrite "' no hay redirección. –

+0

bueno, me siento mucho mejor ahora. :-) –

0
  1. Tiene razón, cree una ruta NotFoundController y el mapa a ella, dicen /404 y luego poner la URL de su archivo web.config (ver @ R0MANARMY) respuesta.

  2. Usted puede simplemente throw new HttpException(404, "Not Found") o si no desea lanzar excepciones (lo cual es costoso) puede simplemente establecer el código de estado 404 a través de Response.StatusCode propiedad y luego devolver un View("My404Template") de sus métodos de acción.

+0

@chakrit: ¿No le dará asp.net mvc un 404 de todos modos sin un NotFoundController? ¿O quiere decir en caso de que quiera redireccionar a algo que no sea una página html 404 estática? – R0MANARMY

4

MVC 3 incluye una clase HttpNotFoundResult y Controller tiene un método estático HttpNotFound también.

public ActionResult Index(int id) { 
     var myThing = Loader.GetById(id); 
     if (myThing == null) { 
      return HttpNotFound("Thing Not Found"); 
     } 
     return View(myThing); 
    } 
0

En caso de que ayuda a alguien por el camino ...

Similar a la respuesta de Fitzchak que tienen una vista personalizada 404 en mi carpeta compartida. Para devolver el código de estado correcto simplemente agregué esto a la parte superior de ese punto de vista

@{ 
    ViewBag.Title = "Page Not Found"; 
    Response.StatusCode = 404; 
} 

funcionó muy bien en mi localhost, pero en mi servidor de producción que tuvo que añadir esta línea a la configuración web porque IIS estaba alcanzando el estado 404 y poniendo su propia página 404.

<system.webServer> 
    ... 
    <httpErrors errorMode="Detailed" /> 
</system.webServer> 
Cuestiones relacionadas