asp.net mvc [handleerror] [authorize]和JsonResult?

时间:2009-10-22 20:12:57

标签: asp.net asp.net-mvc

在处理来自javascript的XHR调用时,利用现有[HandleError]和[Authorize]属性的优雅方法是什么?

因此,例如,一个返回JsonResult的方法GetJson。

当发生错误时,[HandleError]方法将发回一个ViewResult,它将在javascript中的回调函数中重新获得。

然后我必须在javascript中随处放置自定义代码来处理和重定向任何崩溃等。

我想做的是,如果原始操作计划执行此操作,则[HandleError]属性将返回JsonResult。对我而言,这可能是一厢情愿的想法。

同样,如果有未经授权的Json请求,而不是返回一个新的HttpUnauthorizedResult,我想返回一个允许我的客户端代码以常见方式处理事物的JsonResult。

我在这里咆哮错误的树吗?也许有一种更好的方式,MVC可以处理这个我不知道的事情?

其他人如何处理这种情况?

感谢。

PS:我意识到我可以创建自己的[HandleJsonError]和[AuthorizeJson]属性,这些属性返回JsonResults而不是ViewResults,但是我必须将这些放在任何返回Json的方法上,并担心Filter如果我可以使用反射或某些东西使相同的属性根据原始方法的签名采取不同的行为,那肯定会很好。

1 个答案:

答案 0 :(得分:27)

你没有。现在,他们没有帮助JSON。但是:

  

我意识到我可以创建自己的[HandleJsonError]和[AuthorizeJson]属性,这些属性返回JsonResults而不是ViewResults,但是我必须将它们放在任何返回Json的方法上,并担心Filter命令等

我们所做的是子类型现有属性,并使它们有条件地工作:

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和非Ajax。所以没有过滤器订单问题。