2012-07-03 23 views
5

Usando el blog publicado here y un tema here en SO he creado un controlador que debe manejar todas mis páginas de error.MVC3 páginas de error personalizadas dan resultado en blanco

En mis Global.asax.cs Tengo el siguiente fragmento de código:

protected void Application_Error() 
     { 
      var exception = Server.GetLastError(); 
      var httpException = exception as HttpException; 
      var routeData = new RouteData(); 

      Response.Clear(); 
      Server.ClearError(); 

      routeData.Values["controller"] = "Error"; 
      routeData.Values["action"] = "General"; 
      routeData.Values["exception"] = exception; 
      Response.StatusCode = 500; 

      if (httpException != null) 
      { 
       Response.StatusCode = httpException.GetHttpCode(); 
       switch (Response.StatusCode) 
       { 
        case 403: 
         routeData.Values["action"] = "Http403"; 
         break; 
        case 404: 
         routeData.Values["action"] = "Http404"; 
         break; 
       } 
      } 

      // Avoid IIS7 getting in the middle 
      Response.TrySkipIisCustomErrors = true; 
      IController errorsController = new ErrorController(); 
      HttpContextWrapper wrapper = new HttpContextWrapper(Context); 
      var rc = new RequestContext(wrapper, routeData); 
      errorsController.Execute(rc); 
     } 

Mi ErrorController se ve así:

public class ErrorController : BaseController 
    { 
     /// <summary> 
     /// Returns a default view for not having access. 
     /// </summary> 
     public ActionResult Unauthorized() 
     { 
      BaseModel viewModel = new BaseModel 
             { 
              LoginModel = new LogonModel(), 
              ProfessionsTopX = GetTopXProfessions() 
             }; 
      return View(viewModel); 
     } 

     public ActionResult General(Exception exception) 
     { 
      return View("Exception", exception); 
     } 

     public ActionResult Http404() 
     { 
      //This line works 
      //return Content("Not found", "text/plain"); 

      //This line presents a blank page 
      return View("404","_Layout"); 
     } 

     public ActionResult Http403() 
     { 
      return View("403", "_Layout"); 
     } 

    } 

Y mi Razor Ver sólo contiene la pieza de html a continuación;

@{ 
    ViewBag.Title = "404"; 
} 

<h2>404</h2> 

This is a 404 page! 

Cuando uso el contenido de la vuelta I estoy poniendo un textoutput llanura que me dice que estoy mirando un 404 páginas. Sin embargo, quiero que la página 404 se ajuste al resto de mi diseño, por lo que quiero usar mis propias Vistas. Sin embargo, tan pronto como uso Return View obtengo una página en blanco. Espero perderme algo muy obvio, pero no lo veo.

+0

Me está sucediendo exactamente lo mismo, hasta las publicaciones en las que he modelado mi código. –

+0

Me está sucediendo exactamente lo mismo. ¿Alguna vez encontró una solución para este problema? –

Respuesta

4

Estaba teniendo el mismo problema, y ​​finalmente encontré la solución que funcionó para mí. El avance se produjo cuando hice un punto de interrupción en la línea errorsController.Execute(rc);, y se utiliza 'paso en' hasta que me encontré con esta excepción:

The view 'Detail' or its master was not found or no view engine supports the 
searched locations. The following locations were searched: 
~/Views/Errors/Detail.aspx 
~/Views/Errors/Detail.ascx 
~/Views/Shared/Detail.aspx 
~/Views/Shared/Detail.ascx 
~/Views/Errors/Detail.cshtml 
~/Views/Errors/Detail.vbhtml 
~/Views/Shared/Detail.cshtml 
~/Views/Shared/Detail.vbhtml 

La excepción fue tragado, supongo que porque lo que estaba ocurriendo dentro del método Application_Error y porque yo había establecido Response.TrySkipIisCustomErrors = true.

Después de ver este error, rápidamente me di cuenta de que mi problema era simplemente uno de nombres incompatibles: mi controlador se llama realmente ErrorController sin 's', no ErrorsController. El problema para mí fue que configuré routeData.Values["controller"] = "Errors";, lo cual es incorrecto. Cambiarlo a routeData.Values["controller"] = "Error"; solucionó el problema.

Tenga en cuenta que no detectará el error de inmediato, porque crea una instancia directa del controlador y no compilará si tiene esa parte mal escrita. Pero dentro del controlador, al llamar a View() buscará la vista usando la instancia RouteData que construimos y pasamos al objeto RequestContext. Entonces, si el nombre del controlador se escribe incorrectamente allí, MVC no sabe dónde buscar la vista y, dado que los errores personalizados de IIS se omiten, falla silenciosamente.

Resumen breve: compruebe su controlador y vea los nombres. Supongo que algo similar sucedería si tiene el nombre del controlador correcto, pero el nombre del archivo de la vista no coincide.

+0

No, no he encontrado una solución, gracias por su respuesta! Parece muy lógico. Intentaremos esto tan pronto como sea posible y te responderemos al respecto. – Rob

+0

¡Qué estúpido! Cambié el nombre de Errores a Error y luego pude depurar todo. Noté por primera vez que aún recibía una página en blanco, pero después de entrar y salir de todo vi una excepción por la cual era comprensible.Lo resolvió y todo funciona. – Rob

0

Por favor verifique this. Es la mejor forma de implementar el manejo de excepciones en mvc.

He implementado el mismo manejo de excepciones, pero estoy enfrentando algún problema, pero todavía puede consultar this.

+0

Lo intenté anoche, pero desafortunadamente no resolvió el problema (aún) ¡Otras sugerencias son bienvenidas! – Rob

Cuestiones relacionadas