Kendo 数据源未触发重定向响应的错误处理程序
Kendo datasource not triggering error handler for redirect response
我有一些 Kendo MVC 网格绑定到远程 Json 控制器操作,效果很好。 MVC 应用程序使用自定义 AuthorizeAttribute 来授权访问控制器操作,当用户未通过身份验证时,它会使用 302 重定向回复登录页面。
一切都很好,除了当会话过期时,数据源读取调用静默失败,因为它们收到重定向响应而不是预期数据。
我已尝试在数据源的错误事件处理程序中处理这种情况,但在这种情况下不会调用处理程序。
这是错误处理程序:
function childGrid_error(e, gridName) {
if (e.xhr.status === 302)
location.reload();
else
if (e.errors) {
var message = "";
$.each(e.errors, function (key, value) {
if ('errors' in value) {
$.each(value.errors, function () {
message += this + "\n";
});
}
});
kendoAlert(message);
var grid = $(gridName).data("kendoGrid");
grid.cancelChanges();
}
}
这是一个 Kendo 数据源,采用 Razor 语法:
.DataSource(ds => ds
.Ajax()
.Model(m => m.Id(c => c.Id))
.Sort(s=>s.Add(f=>f.Username))
.PageSize(10)
.Events(e => e.Error("function(e) { grid_error(e, \"UsersGrid\");}"))
.Read("GetUsers", "Admin")
.Create("PutUser", "Admin")
.Destroy("DeleteUser", "Admin")
.Update("UpdateUser", "Admin"))
关于这个错误处理程序,我是否遗漏了什么?
事实证明,浏览器自动遵循 xhr 上的重定向,kendo 数据源无法以任何方式知道这一点。由于重定向 return 是一个 200 状态代码,错误处理程序根本不会被触发。在我看来,由于响应绝不是 json 格式并且不可能被数据源绑定,错误处理程序应该被 kendo 数据源触发。
总之...
我的解决方案是修改自定义 AuthorizeAttribute 以便 return 401(未授权)状态代码,但仅适用于 ajax 请求。这样,数据源错误处理程序将被调用并能够对过期会话问题做出反应。
自定义AuthorizeAttribute中的相关代码:
if (filterContext.HttpContext.Request.IsAjaxRequest())
filterContext.Result = new HttpStatusCodeResult(System.Net.HttpStatusCode.Unauthorized);
else
filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary(new { controller = "Auth", action = "Login" }));
这就是数据源错误处理程序现在的样子:
function childGrid_error(e, gridName) {
if (e.xhr.status === 401) //Unauthorized
location.reload();
else
if (e.errors) {
var message = "";
$.each(e.errors, function (key, value) {
if ('errors' in value) {
$.each(value.errors, function () {
message += this + "\n";
});
}
});
kendoAlert(message);
var grid = $(gridName).data("kendoGrid");
grid.cancelChanges();
}
}
location.reload()
位实际上会刷新页面并将浏览器置于正常的身份验证工作流程中。
我有一些 Kendo MVC 网格绑定到远程 Json 控制器操作,效果很好。 MVC 应用程序使用自定义 AuthorizeAttribute 来授权访问控制器操作,当用户未通过身份验证时,它会使用 302 重定向回复登录页面。 一切都很好,除了当会话过期时,数据源读取调用静默失败,因为它们收到重定向响应而不是预期数据。 我已尝试在数据源的错误事件处理程序中处理这种情况,但在这种情况下不会调用处理程序。
这是错误处理程序:
function childGrid_error(e, gridName) {
if (e.xhr.status === 302)
location.reload();
else
if (e.errors) {
var message = "";
$.each(e.errors, function (key, value) {
if ('errors' in value) {
$.each(value.errors, function () {
message += this + "\n";
});
}
});
kendoAlert(message);
var grid = $(gridName).data("kendoGrid");
grid.cancelChanges();
}
}
这是一个 Kendo 数据源,采用 Razor 语法:
.DataSource(ds => ds
.Ajax()
.Model(m => m.Id(c => c.Id))
.Sort(s=>s.Add(f=>f.Username))
.PageSize(10)
.Events(e => e.Error("function(e) { grid_error(e, \"UsersGrid\");}"))
.Read("GetUsers", "Admin")
.Create("PutUser", "Admin")
.Destroy("DeleteUser", "Admin")
.Update("UpdateUser", "Admin"))
关于这个错误处理程序,我是否遗漏了什么?
事实证明,浏览器自动遵循 xhr 上的重定向,kendo 数据源无法以任何方式知道这一点。由于重定向 return 是一个 200 状态代码,错误处理程序根本不会被触发。在我看来,由于响应绝不是 json 格式并且不可能被数据源绑定,错误处理程序应该被 kendo 数据源触发。
总之...
我的解决方案是修改自定义 AuthorizeAttribute 以便 return 401(未授权)状态代码,但仅适用于 ajax 请求。这样,数据源错误处理程序将被调用并能够对过期会话问题做出反应。
自定义AuthorizeAttribute中的相关代码:
if (filterContext.HttpContext.Request.IsAjaxRequest())
filterContext.Result = new HttpStatusCodeResult(System.Net.HttpStatusCode.Unauthorized);
else
filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary(new { controller = "Auth", action = "Login" }));
这就是数据源错误处理程序现在的样子:
function childGrid_error(e, gridName) {
if (e.xhr.status === 401) //Unauthorized
location.reload();
else
if (e.errors) {
var message = "";
$.each(e.errors, function (key, value) {
if ('errors' in value) {
$.each(value.errors, function () {
message += this + "\n";
});
}
});
kendoAlert(message);
var grid = $(gridName).data("kendoGrid");
grid.cancelChanges();
}
}
location.reload()
位实际上会刷新页面并将浏览器置于正常的身份验证工作流程中。