【问题标题】:asp.net mvc [handleerror] [authorize] with JsonResult?asp.net mvc [handleerror] [authorize] 与 JsonResult?
【发布时间】:2009-10-22 20:12:56
【问题描述】:

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

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

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

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

如果原始操作计划这样做,我想做的是让 [HandleError] 属性返回 JsonResult。这可能是我的一厢情愿。

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

我在这里叫错树了吗?也许 MVC 有更好的方式来处理我不知道的这个问题?

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

谢谢。

PS:我意识到我可以创建自己的 [HandleJsonError] 和 [AuthorizeJson] 属性,它们返回 JsonResults 而不是 ViewResults,但是我必须四处走动并将它们放在任何返回 Json 的方法上,并担心过滤器订单等。如果我可以使用反射或其他东西使相同的属性根据原始方法的签名而有所不同,那肯定会很好。

【问题讨论】:

    标签: asp.net asp.net-mvc


    【解决方案1】:

    你没有。现在,他们对 JSON 没有帮助。然而:

    我意识到我可以创建自己的 [HandleJsonError] 和 [AuthorizeJson] 属性,它们返回 JsonResults 而不是 ViewResults,但是我必须四处走动并将它们放在任何返回 Json 的方法上,并担心过滤器顺序等.

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

    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。所以没有过滤器顺序问题。

    【讨论】:

    • 谢谢! Request.IsAjaxRequest() 非常有帮助。我不知道它存在。
    • 是MVC添加的扩展方法。它实际上不是 Request 的一部分。
    • 谢谢!这是一种非常优雅的方式,应该标记为正确答案。虽然不需要构造函数。
    • 您也可以只覆盖HandleUnauthorizedRequest 方法并将结果设置在那里,而无需对基类的结果进行额外检查。
    • filterContext.HttpContext.Request.IsAjaxRequest() 在我的情况下不起作用
    猜你喜欢
    • 1970-01-01
    • 2010-10-11
    • 2011-07-01
    • 2011-03-08
    • 1970-01-01
    • 2010-10-20
    • 1970-01-01
    • 2011-12-11
    • 2014-07-03
    相关资源
    最近更新 更多