首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >jsonResult未由OnActionExecuting事件返回

jsonResult未由OnActionExecuting事件返回
EN

Stack Overflow用户
提问于 2015-02-12 22:41:30
回答 1查看 2.2K关注 0票数 1

我已经创建了一个ActionFilterAttribute,在允许MVC控制器get/post请求被处理之前,它可以验证帐户的可处理性。如果帐户不可用,我希望向客户端返回一个错误。如果请求是ajax帖子,我希望在响应中包含json数据。由于某种原因,json数据只有在浏览器和网站在同一台机器上运行时才返回到浏览器。如果我在另一台机器上浏览网站并预编好ajax帖子,响应内容-类型将以"text/html“的形式返回。但是,如果浏览器运行在与网站相同的机器上,响应内容-类型将正确返回为"application/json“。

我做错了什么?

ActionFilterAttribute

代码语言:javascript
复制
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
    base.OnActionExecuting(filterContext);

    if (filterContext.Result == null)
    {
        if (IsAccountUnavailable(Key))
        {
            if (filterContext.HttpContext.Request.IsAjaxRequest())
            {
                filterContext.HttpContext.Response.StatusCode = (int)HttpStatusCode.Conflict;
                filterContext.HttpContext.Response.ContentType = "application/json";
                filterContext.Result = new JsonResult
                {
                    Data = new {Error = "Unavailable", Url = GetLogOffUrl()},
                    JsonRequestBehavior = JsonRequestBehavior.AllowGet
                };
            }
          else
                filterContext.Result = new RedirectResult(GetLogOffUrl());
        }
    }
}

jQuery ajax帖子

代码语言:javascript
复制
$.ajax({
    url: window.location.href,
    type: 'POST',
    data: JSON.stringify(ko.mapping.toJS(serverModel.SelectionsViewModel)),
    contentType: "application/json; charset=utf-8",
    dataType: 'json'
})
    .done(function (data) {
        if (data.isValid)
            window.location.href = serverModel.NextView();
        else
            showGenericSaveError();
    })
    .fail(function (jqXhr) {
        handleAjaxError(jqXhr);
    });
};
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-02-13 15:30:17

由于一位同事找到了下面这篇文章,我的问题已经解决了。我需要设置Response.TrySkipIisCustomErrors = true

Returning http status code 409 Conflict (without ASP.NET MVC alterations)

工作密码..。

代码语言:javascript
复制
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
    base.OnActionExecuting(filterContext);

    if (filterContext.Result == null)
    {
        if (QuoteServiceLayer.IsAccountUnavailable(AccountKey, EnrollmentPeriodType, EmployeeKey))
        {
            if (filterContext.HttpContext.Request.IsAjaxRequest())
            {
                filterContext.HttpContext.Response.StatusCode = (int)HttpStatusCode.Conflict;
                filterContext.HttpContext.Response.TrySkipIisCustomErrors = true;
                filterContext.Result = new JsonResult
                {
                    Data = new {Error = "Unavailable", Url = GetLogOffUrl()},
                    JsonRequestBehavior = JsonRequestBehavior.AllowGet
                };
            }
        else
            filterContext.Result = new RedirectResult(GetLogOffUrl());
        }
    }
}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28489275

复制
相关文章

相似问题

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