首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用JsonResult的asp.net mvc [handleerror] [authorize]?

使用JsonResult的asp.net mvc [handleerror] [authorize]?
EN

Stack Overflow用户
提问于 2009-10-23 04:12:57
回答 1查看 5.6K关注 0票数 19

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

例如,假设有一个返回JsonResult的方法GetJson。

当出现错误时,HandleError方法将返回一个ViewResult,它将在javascript的回调函数中检索。

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

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

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

我是不是找错人了?也许MVC还有一种更好的方式来处理这个我不知道的事情?

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

谢谢。

PS:我意识到我可以创建自己的HandleJsonError和AuthorizeJson属性,它们返回JsonResults而不是ViewResults,但是我不得不把它们放在任何返回Json的方法上,并担心过滤顺序等。如果我可以使用反射或其他东西,让相同的属性根据原始方法的签名有不同的行为,那就太好了。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2009-10-23 04:22:37

你不需要。现在,他们对JSON没有帮助。但是:

我意识到我可以创建我自己的HandleJsonError和AuthorizeJson属性,它们返回JsonResults而不是ViewResults,但是我不得不把它们放在任何返回Json的方法上,并担心过滤顺序等问题。

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

代码语言:javascript
复制
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。所以没有过滤顺序的问题。

票数 30
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1609677

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档