处理来自javascript的XHR调用时,有什么巧妙的方法可以利用现有的[HandleError]和[Authorize]属性?

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

发生错误时,[HandleError]方法将发回一个ViewResult,该结果将在javascript的回调函数中检索。

然后,我不得不将自定义代码放置在javascript中的任何地方,以处理和重定向任何崩溃等。

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

同样,如果出现未经授权的Json请求,而不是返回新的HttpUnauthorizedResult,我想返回一个JsonResult,它允许我的客户端代码以通用方式处理事情。

我在这里树错树了吗?也许还有一种更好的方法可以让MVC处理我不知道的问题?

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

谢谢。

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

最佳答案

你不知道目前,他们对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。因此,没有过滤器顺序问题。

关于asp.net - asp.net mvc [handleerror] [授权]与JsonResult?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1609677/

10-10 01:07