2010-07-01 17 views
6

Tengo un ActionResult personalizado para devolver ciertos errores HTTP, como NotFoundResult y ForbiddenResult, todos ellos provienen de ViewResult.Configuración del estado HTTP en ASP.NET Los resultados del controlador MVC no representan la vista

Los uso para instancias como acciones de cortocircuito con un 404 si no se encontró una entidad en la base de datos durante el curso de una acción.

Dentro de estos objetos de resultado, establezco el estado de HTTP en el número apropiado. Cuando hago eso, la vista de que estos ViewResults referencia no representa. Debo dejar el estado como 200 OK para que se visualice mi vista.

¿Cómo configuro un estado apropiado Y represento una vista en ASP.NET MVC 2.0?

+0

¿Se refiere a "la vista no se procesa" o "mi navegador no la muestra?" Porque esas no son las mismas cosas. –

+0

La respuesta de la aplicación es 0 bytes. No se escribe ninguna vista en la respuesta. –

Respuesta

8

Tengo un encargo para ActionResult devolver ciertos errores HTTP, como NotFoundResult y ForbiddenResult, todos ellos se derivan de ViewResult.

Permítame sugerir un manejo alternativo de error:

de inicio mediante la creación de un controlador de error y las vistas correspondientes:

public class ErrorController : Controller 
{ 
    public ActionResult General() 
    { 
     return View(); 
    } 

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

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

En Global.asax definen el Application_Error método:

protected void Application_Error(object sender, EventArgs e) 
{ 
    var exception = Server.GetLastError(); 
    // TODO: Log the exception with your favorite logging framework 

    Response.Clear(); 
    var httpException = exception as HttpException; 

    var routeData = new RouteData(); 
    // Take the ErrorController 
    routeData.Values.Add("controller", "error"); 

    if (httpException == null) 
    { 
     // Use the General action for any unhandled error 
     routeData.Values.Add("action", "general"); 
    } 
    else 
    { 
     switch (httpException.GetHttpCode()) 
     { 
      case 404: 
       routeData.Values.Add("action", "httpError404"); 
       break; 
      case 500: 
       routeData.Values.Add("action", "httpError500"); 
       break; 
      default: 
       routeData.Values.Add("action", "general"); 
       break; 
     } 
    } 

    // Add the exception to route data so that the error controller 
    // could use it with RouteData.Values["error"] 
    routeData.Values.Add("error", exception); 

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

Finalmente arroje las excepciones apropiadas:

public class HomeController: Controller 
{ 
    public ActionResult Index(int id) 
    { 
     var model = _repository.GetModel(id); 
     if (model == null) 
     { 
      throw new HttpException(404, "Model not found with id = " + id); 
     } 
     return View(model); 
    } 
} 
+0

Parece una buena manera de consolidar el código de manejo de errores. ¡Me pondré en contacto contigo gracias! –

+0

Todavía no estoy seguro de por qué las respuestas estaban vacías, pero esto resolvió mi problema al consolidar algunos códigos de error juntos. ¡Gracias por proporcionarnos una implementación! Una cosa que agregaría es que los errores personalizados deberían desactivarse al hacer esto. –

+0

@BC, difícil de decir ya que no ha proporcionado ningún código fuente. –

Cuestiones relacionadas