Есть ли способ зарегистрировать глобальные фильтры, но исключить запросы JsonResult? - PullRequest
2 голосов
/ 22 августа 2011

Я определил пользовательский атрибут авторизации.Чтобы избежать перечисления атрибута выше каждого ActionResult в моих контроллерах, я добавил атрибут в свой global.asax следующим образом:

public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
    filters.Add(new MyAuthorizeAttribute());
}

Однако непреднамеренное последствие этого заключается в том, чтомой код авторизации вызывается во время всех моих вызовов JsonResult.Есть ли способ для MyAuthorizeAttribute вызываться ТОЛЬКО при вызовах ActionResult, а НЕ при вызовах JsonResult?Я использую MVC3.

Ответы [ 2 ]

1 голос
/ 22 августа 2011

Запускается ли фильтр до или после метода действия?

Если он запускается раньше, вы не можете знать, какой конкретный тип будет возвращен, потому что все действия возвращают ActionResult (если вы специально не возвращаете JsonResult - это другая история).

Если он запускается после метода действия, то в коде фильтра проверьте, является ли результат JsonResult, например:

    public override void OnResultExecuting(ResultExecutingContext filterContext)
    {
        if (!(filterContext.Result is JsonResult))
        {
            // do whatever you want...
        }

        base.OnResultExecuting(filterContext);
    }
0 голосов
/ 31 января 2012

Я не согласен с предыдущим ответом. Вы, кажется, подошли к этому не с того конца. Вы должны смотреть на тип запроса , а не на тип возврата .

Вы можете проверить Ajax-запросы перед действием в вашем фильтре. У тебя должно быть что-то вроде этого ...

public class MyAuthorizeAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        if (filterContext.HttpContext.Request.IsAjaxRequest())
            return;

        // else do authorisation stuff...
    }
} 
...