2011-04-12 27 views
30

he probado los siguientes 2 cosas a tener una página de un error 404:404 Error ASP.NET MVC 3

public ActionResult Index() 
{ 
    return new HttpStatusCodeResult(404); 
} 

public ActionResult NotFound() 
{ 
    return HttpNotFound(); 
} 

pero ambos de ellos acaba de presentar una página en blanco. ¿Cómo puedo devolver manualmente un error 404 desde ASP.NET MVC 3?

Respuesta

62

Si inspecciona la respuesta utilizando el violín, creo que encontrará que la página en blanco está devolviendo un código de estado 404. El problema es que no se está visualizando y, por lo tanto, la página en blanco.

En su lugar, podría obtener una vista real al agregar un elemento customErrors a su web.config que redirigirá al usuario a una url específica cuando se produce un determinado código de estado que luego puede manejar como lo haría con cualquier url . Aquí hay un recorrido por debajo:

Primero arroje el HttpException donde corresponda. Al crear una instancia de la excepción, asegúrese de usar una de las sobrecargas que toma un código de estado http como un parámetro como a continuación.

throw new HttpException(404, "NotFound"); 

A continuación, agregue un controlador de errores personalizado en el archivo web.config para que usted pueda determinar qué vista se deben representar cuando se produce la excepción anteriormente. He aquí un ejemplo a continuación:

<configuration> 
    <system.web> 
     <customErrors mode="On"> 
      <error statusCode="404" redirect="~/404"/> 
     </customErrors> 
    </system.web> 
</configuration> 

Ahora añadir una entrada de ruta en su Global.asax que va a manejar la url "404", que hará llegar la petición a la acción de un controlador que va a mostrar la vista de su página 404 .

Global.asax

routes.MapRoute(
    "404", 
    "404", 
    new { controller = "Commons", action = "HttpStatus404" } 
); 

CommonsController

public ActionResult HttpStatus404() 
{ 
    return View(); 
} 

Todo lo que queda es añadir un punto de vista de la acción anterior.

Una advertencia con el método anterior: de acuerdo con el libro "Pro ASP.NET 4 en C# 2010" (Apress) el uso de customErrors no está actualizado si está utilizando IIS 7. En su lugar debe utilizar la sección httpErrors. He aquí una cita del libro:

But although this setting still works with Visual Studio’s built-in test web server, it’s effectively been replaced by the <httpErrors> section in IIS 7.x.

17

estoy con éxito utilizando la siguiente:

return new HttpNotFoundResult(); 
15

throw new HttpException(404, "NotFound"); junto con una custom error handler funciona bien para mí.

2

Usted puede personalizar 404 resultado con

return new HttpStatusCodeResult(404, "My message"); 
+1

no está sujeta a que el temor "404 demasiado corto" error en el IE? –

6

Debe utilizar

// returns 404 Not Found as EmptyResult() which is suitable for ajax calls 
return new HttpNotFoundResult(); 

cuando se están haciendo llamadas AJAX a los controladores y no hacer encuentra cualquier contenido

Cuando vaya a hacer llamadas clásicas de controlador de acciones y regresan Vistas las que debe utilizar:

// throwing new exception returns 404 and redirects to the view defined in web.config <customErrors> section 
throw new HttpException(404, ExceptionMessages.Error_404_ContentNotFound);