Как я могу заставить HandleErrorAttribute работать с Ajax?

В моем приложении ASP.NET MVC 2 я использую HandleErrorAttribute для отображения пользовательской ошибочной страницы в случае необработанных исключений, и это работает отлично, если исключения не происходит в действии, названном Ajax. ActionLink. В этом случае ничего не происходит. Действительно ли возможно использовать HandleErrorAttribute для обновления целевого элемента с контентом частичного представления "Error.ascx"?

5
задан SlimShaggy 18 July 2010 в 08:17
поделиться

1 ответ

Для этого вы можете написать фильтр настраиваемых действий:

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

И затем указать частичное представление, которое будет использоваться:

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

И, наконец, в вашем представлении, предполагая, что у вас есть следующая ссылка:

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

Вы можете сделать handleFailure для обновления правильного 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>
11
ответ дан 13 December 2019 в 19:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: