当AJAX调用触发响应时,Web API ActionFilterAttribute不会返回状态

时间:2016-12-02 14:42:18

标签: c# ajax asp.net-mvc-4 asp.net-web-api jquery-select2

我使用以下代码从MVC视图进行Select2调用:

ajax: {
    url: url,
    delay: 150,
    data: function (params) {
        return GMK_Select2QueryData(params, 30, additionalData);
    },
    processResults: function (data, params) {
        var resultsArr = [];
        for (var i = 0; i < data.items.length; i++) {
            resultsArr.push({
                id: data.items[i].id,
                text: data.items[i].text,
                description: data.items[i].description,
                data: data.items[i].data
            });
        }
        return {
            results: resultsArr,
            pagination: {
                more: data.more
            }
        };
    },
    error: function(jqXHR, textStatus, errorThrown) {
            alert(jqXHR.status);
    },
    cache: false
}

我尝试捕获会话是否超时,然后将状态代码返回到&#34;错误&#34;功能,以便我可以在屏幕上弹出一些内容,说明他们需要重新登录。现在,我只是提醒屏幕进行测试。

我正在使用Web API ActionFilterAttribute,但是当我创建错误响应时,无论我做什么,jqXHR总是status = 0。

public class SessionActionFilter : ActionFilterAttribute
{
    public override void OnActionExecuting(HttpActionContext filterContext)
    {
        HttpContext ctx = HttpContext.Current;
        if (ctx.Session == null || ctx.Session["user"] == null)
        {
            filterContext.Response = filterContext.Request.CreateErrorResponse(HttpStatusCode.RequestTimeout, "Session Timeout");
        }
        base.OnActionExecuting(filterContext);
    }
}

1 个答案:

答案 0 :(得分:0)

SessionActionFilter动作过滤器非常完美。过滤器没问题

请按以下方式更新Select2电话: -

答案1: -

ajax: {
            url: url,
            delay: 150,
            data: function (params) {
                return GMK_Select2QueryData(params, 30, additionalData);
            },
            processResults: function (data, params) {
                var resultsArr = [];
                for (var i = 0; i < data.items.length; i++) {
                    resultsArr.push({
                        id: data.items[i].id,
                        text: data.items[i].text,
                        description: data.items[i].description,
                        data: data.items[i].data
                    });
                }
                return {
                    results: resultsArr,
                    pagination: {
                        more: data.more
                    }
                };
            },
            params: {
                error: function (jqXHR, textStatus, errorThrown) {
                    alert(jqXHR.status);
                }
            },
            cache: false
        }

可以通过以下方式获得错误

如果您只想处理响应错误,使用transport选项会导致select2中断,如下例所示。

transport: {
   return $.ajax().error(function() {
        alert("error fetching data"); 
   });
}

还有另一种更简单的方法来处理错误。这是通过使用params选项,如下例所示。

params: {
    error: function(response) {
        alert("error fetching data"); 
    }
}

希望它有所帮助。

请参考select2

另一个答案

在Select2.js文件中添加&#34;错误&#34;

的扩展名

serach for text&#34; $ .extend(params &#34;

然后按照以下代码

更新扩展程序
$.extend(params, {
                url: url,
                dataType: options.dataType,
                data: data,
                success: function (data) {
                    if (requestNumber < requestSequence) {
                        return;
                    }
                    // TODO - replace query.page with query so users have access to term, page, etc.
                    var results = options.results(data, query.page);
                    query.callback(results);
                },
                /* BEGIN added code */
                error: function (jqXHR, status, error) {
                    if (requestNumber < requestSequence) {
                        return;
                    }
                    var r = null;
                    if (options.error) {
                        r = options.error(jqXHR, status, error);
                    }
                    query.callback(r || { results: [] });
                } /* END added code */
            });

您更新的ajax电话

ajax: {
                url: url,
                delay: 150,
                data: function (params) {
                    return GMK_Select2QueryData(params, 30, additionalData);
                },
                processResults: function (data, params) {
                    var resultsArr = [];
                    for (var i = 0; i < data.items.length; i++) {
                        resultsArr.push({
                            id: data.items[i].id,
                            text: data.items[i].text,
                            description: data.items[i].description,
                            data: data.items[i].data
                        });
                    }
                    return {
                        results: resultsArr,
                        pagination: {
                            more: data.more
                        }
                    };
                },
                 error: function (jqXHR, status, error) {
                    alert(error + ": " + jqXHR.responseText + ": " + jqXHR.status);                    
                },
                cache: false
            }