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

Sco*_*ach 19 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命令等.如果我可以使用反射或某些东西使相同的属性根据原始方法的签名采取不同的行为,那肯定会很好.

Cra*_*ntz 28

你没有.现在,他们没有帮助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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,JS代码可以查找403(因为ASP.NET执行401并返回错误页面),并且相同的属性适用于Ajax和非Ajax.所以没有过滤器订单问题.