2011-01-28 11 views
6

Entiendo cómo configurar mis propias rutas, pero ¿cómo maneja las rutas que caen por las grietas de la tabla de enrutamiento? Quiero decir, supongo que la ruta predeterminada {controller}/{action}/{id} podría ser un candado genérico, pero no estoy seguro de si ese es el camino a seguir. Me gusta dejar que mis usuarios sepan que han solicitado datos/una 'página' que no existe.Manejo de errores de ruta en ASP.NET MVC

¿Es aquí donde entra el filtro [HandleError]? ¿Como funciona exactamente?

Respuesta

7

Si no encuentra su ruta, quiere manejarla como un error normal HTTP 404.

Si solo agrega el atributo [HandleError] a su clase o acción, MVC buscará una vista Error en su carpeta de vistas.

También puede añadir una o incluso una página estática ErrorController y añadir esto a su Web.config:

<customErrors mode="On" > 
    <error statusCode="404" redirect="/Error/PageNotFound/" /> 
</customErrors> 

o usted podría manejar el HTTP 404 en su Global.asax.cs y la ruta a un ErrorController mediante programación. Así es como generalmente lo hago:

protected void Application_Error(object sender, EventArgs e) 
{ 
    var ex = Server.GetLastError().GetBaseException(); 

    var routeData = new RouteData(); 

    if (ex.GetType() == typeof(HttpException)) 
    { 
     var httpException = (HttpException)ex; 

     switch (httpException.GetHttpCode()) 
     { 
      case 404: 
       routeData.Values.Add("action", "PageNotFound"); 
       break; 
      default: 
       routeData.Values.Add("action", "GeneralError"); 
       break; 
     } 
    } 
    else 
    { 
     routeData.Values.Add("action", "GeneralError"); 
    } 

    routeData.Values.Add("controller", "Error"); 
    routeData.Values.Add("error", ex); 

    IController errorController = new ErrorController(); 
    errorController.Execute(new RequestContext(new HttpContextWrapper(Context), routeData)); 
} 
4

Se puede definir una ruta como esta:

routes.MapRoute(
       "PageNotFound", 
       "{*catchall}", 
       new { controller = "Home", action = "PageNotFound" } 
       ); 

que simplemente realizar una acción en un controlador de la siguiente manera:

 public ActionResult PageNotFound() 
     { 
      ViewBag.Message = "Sorry, the page you requested does not exist."; 
      return View(); 
     } 

Esta ruta deberán ser llenados añade en último lugar, de esa manera se captura cualquier solicitud eso no se puede mapear

HandleError atributo se utiliza para detectar excepciones que pueden ocurrir dentro de las acciones del controlador.

+0

problema con este enfoque es que .. si intenta representar la acción del niño @ Html.Action (routeValues) con valores erróneos, va a proporcionar acción '' PageNotFound' como PartialView' sin informar realmente ninguna excepción. – Nenad