asp.net mvc [handleerror] [авторизоваться] с JsonResult? - PullRequest
19 голосов
/ 23 октября 2009

Каков элегантный способ использовать существующие атрибуты [HandleError] и [Authorize] при работе с вызовами XHR из javascript?

Так, скажем, например, метод GetJson, который возвращает JsonResult.

При возникновении ошибки метод [HandleError] отправит обратно ViewResult, который будет получен в функции обратного вызова в javascript.

Затем я должен был бы разместить пользовательский код повсюду в javascript для обработки и перенаправления любых сбоев и т. Д.

Что я хотел бы сделать, так это чтобы атрибут [HandleError] возвращал JsonResult, если исходное действие планировало это сделать. Это может быть желаемое за действительное с моей стороны.

Аналогичным образом, если приходит неавторизованный запрос Json, вместо возврата нового HttpUnauthorizedResult, я бы хотел вернуть JsonResult, который позволяет моему клиентскому коду обрабатывать вещи обычным образом.

Я лаю не на том дереве? Может быть, есть еще более приятный способ, которым MVC может справиться с этим, о чем я не знаю?

Как другие люди справляются с этим сценарием?

Спасибо.

PS: я понимаю, что могу создать свои собственные атрибуты [HandleJsonError] и [AuthorizeJson], которые возвращают JsonResults вместо ViewResults, но тогда мне придется обойти их и поместить в любой метод, который возвращает Json, и беспокоиться о фильтре порядок и т. д. Было бы неплохо, если бы я мог использовать отражение или что-то, чтобы один и тот же атрибут действовал по-разному в зависимости от сигнатуры исходного метода.

1 Ответ

28 голосов
/ 23 октября 2009

Ты не. Прямо сейчас они не помогают с JSON. Тем не менее:

Я понимаю, что могу создать свои собственные атрибуты [HandleJsonError] и [AuthorizeJson], которые возвращают JsonResults вместо ViewResults, но тогда мне придется обойти их и поместить в любой метод, который возвращает Json, и беспокоиться о порядке фильтрации и т.д. .

Что мы сделали, так это подтип существующих атрибутов и заставили их работать условно:

public sealed class AjaxAuthorizeAttribute : AuthorizeAttribute
{
    public override void OnAuthorization(AuthorizationContext filterContext)
    {
        base.OnAuthorization(filterContext);
        if (filterContext.Result == null)
        {
            return;
        }
        else if (filterContext.Result.GetType() == typeof(HttpUnauthorizedResult) 
            && filterContext.HttpContext.Request.IsAjaxRequest())
        {
            filterContext.Result = new ContentResult();
            filterContext.HttpContext.Response.StatusCode = 403;
        }
    }
}

Теперь код JS может искать 403 (потому что ASP.NET ест 401 и возвращает страницу с ошибкой) и один и тот же атрибут работает для Ajax и non-Ajax. Так что нет проблем с порядком фильтрации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...