2

我已经定义了一个自定义授权属性。为了避免在我的控制器中的每个 ActionResult 上方列出该属性,我已将该属性添加到我的 global.asax 中,如下所示:

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

然而,这样做的一个意想不到的后果是,在我的所有 JsonResult 调用期间,我的授权代码也会被调用。有没有办法让 MyAuthorizeAttribute 只在 ActionResult 调用上而不是在 JsonResult 调用上被调用?我正在使用 MVC3。

4

2 回答 2

1

过滤器是在操作方法之前还是之后运行?

如果它之前运行,您将无法知道将返回什么具体类型,因为所有操作都返回 ActionResult(除非您专门返回 JsonResult - 那是另一回事)。

如果它在 action 方法之后运行,则在您的过滤器代码中检查结果是否为 JsonResult,如下所示:

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

        base.OnResultExecuting(filterContext);
    }
于 2011-08-22T14:42:36.737 回答
0

我不同意前面的答案。你似乎从错误的角度来处理这个问题。您应该查看请求类型,而不是返回类型

您可以在过滤器中的操作之前检查 Ajax 请求。你应该有这样的东西......

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

        // else do authorisation stuff...
    }
} 
于 2012-01-31T14:51:30.560 回答