首页 > 解决方案 > 当从剑道组合框读取操作的ajax调用时如何处理会话超时

问题描述

使用剑道组合框时如何处理会话超时?

下面是我的剑道组合框的 html 代码

@(Html.Kendo().ComboBoxFor(model => model.PropertyName)
                              .AutoBind(true)
                              .Suggest(true)
                              .DataTextField("Text")
                              .DataValueField("Value")
                              .DataSource(source =>
                              {
                                  source.Read(read =>
                                  {
                                      read.Action("ActionName", "ControllerName");
                                  })
                                  .ServerFiltering(true);
                              })
                              .Animation(false)
                              .Filter("contains")
                              .HighlightFirst(false)                              
                )

当 read.Action 在控制器会话超时发生时调用,我已经编写了自定义属性来检查会话过期并使用以下代码返回 403 状态代码

if (filterContext.RequestContext.HttpContext.Request.IsAjaxRequest())
                    {
                        filterContext.Result = new HttpStatusCodeResult(HttpStatusCode.Forbidden, "Forbidden");
                        return;
                    }

并且使用下面的代码在 layout.cshtml 页面中处理返回的状态并重新加载页面以转到登录页面

$.ajaxSetup({
        error: function (x, e) {
            if (x.status == 403) {
                window.location.reload();
            }
        }
    });

它适用于所有 ajax 请求,但不适用于来自 kendo 组合框的 ajax 请求。请在剑道组合框 ajax 请求时帮我处理它。

标签: c#jqueryajaxkendo-asp.net-mvc

解决方案


我通过将完成事件放入 ajaxsetup 解决了这个会话超时问题。当 ajax 请求从 kendo 发生时,当响应获得 403 时,它不会将其视为错误,它称为完成事件而不是称为错误事件,因此在将完成事件页面重定向到登录页面后

$.ajaxSetup({
        error: function (x, e) {
            if (x.status == 403) {

                window.location.reload();
            }
        },
        complete: function (x, e) {
            if (x.status == 403) {

                window.location.reload();
            }
        }
    });  

它按我的预期工作。


推荐阅读