2010-07-18 22 views
5

En mi aplicación ASP.NET MVC 2 utilizo HandleErrorAttribute para mostrar una página de error personalizada en caso de excepciones no controladas, y funciona perfectamente a menos que la excepción ocurra en una acción llamada por Ajax.ActionLink. En este caso, no pasa nada. ¿Es posible usar HandleErrorAttribute para actualizar el elemento de destino con el contenido de una vista parcial "Error.ascx"?¿Cómo puedo hacer que HandleErrorAttribute funcione con Ajax?

Respuesta

11

Para lograr esto se podría escribir un filtro de acción personalizada:

public class AjaxAwareHandleErrorAttribute : HandleErrorAttribute 
{ 
    public string PartialViewName { get; set; } 

    public override void OnException(ExceptionContext filterContext) 
    { 
     // Execute the normal exception handling routine 
     base.OnException(filterContext); 

     // Verify if AJAX request 
     if (filterContext.HttpContext.Request.IsAjaxRequest()) 
     { 
      // Use partial view in case of AJAX request 
      var result = new PartialViewResult(); 
      result.ViewName = PartialViewName; 
      filterContext.Result = result; 
     } 
    } 
} 

Y a continuación, especifique la vista parcial a utilizar:

[AjaxAwareHandleError(PartialViewName = "~/views/shared/error.ascx")] 
public class HomeController : Controller 
{ 
    public ActionResult Index() 
    { 
     return View(); 
    } 

    public ActionResult SomeAction() 
    { 
     throw new Exception("shouldn't have called me"); 
    } 
} 

Y, finalmente, en su opinión, suponiendo que tiene el siguiente enlace :

<%= Ajax.ActionLink("some text", "someAction", new AjaxOptions { 
    UpdateTargetId = "result", OnFailure = "handleFailure" }) %> 

usted podría hacer la función para actualizar el handleFailure div adecuada:

<script type="text/javascript"> 
    function handleFailure(xhr) { 
     // get the error text returned by the partial 
     var error = xhr.get_response().get_responseData(); 

     // place the error text somewhere in the DOM 
     document.getElementById('error').innerHTML = error; 
    } 
</script> 
+0

Esta página es también vale la pena leer, ya que añade más información a este respecto: http://jimmylarkin.net/post/2011/09/30/MVC-3-HandleError-Attribute-and- AJAX-Forms.aspx –

Cuestiones relacionadas