2010-07-18 6 views
5

Dans mon application ASP.NET MVC 2, j'utilise HandleErrorAttribute pour afficher une page d'erreur personnalisée en cas d'exceptions non gérées, et cela fonctionne parfaitement, sauf si l'exception se produit dans une action appelée par Ajax.ActionLink. Dans ce cas, rien ne se passe. Est-il possible d'utiliser HandleErrorAttribute pour mettre à jour l'élément cible avec le contenu d'une vue partielle "Error.ascx"?Comment faire pour que HandleErrorAttribute fonctionne avec Ajax?

Répondre

11

Pour ce faire, vous pouvez écrire un filtre d'action personnalisé:

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; 
     } 
    } 
} 

Et puis spécifiez la vue partielle à utiliser:

[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"); 
    } 
} 

Enfin, selon vous, en supposant que vous avez le lien suivant :

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

Vous pouvez faire la fonction handleFailure mettre à jour le bon div:

<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

Cette page est aussi mérite d'être lu car il ajoute plus d'information à ce sujet: http://jimmylarkin.net/post/2011/09/30/MVC-3-HandleError-Attribute-and- AJAX-Forms.aspx –

Questions connexes