c# - Kendo 数据源未触发重定向响应的错误处理程序

标签 c# .net asp.net-mvc razor kendo-datasource

我有一些 Kendo MVC 网格绑定(bind)到远程 Json Controller 操作,效果很好。 MVC 应用程序使用自定义 AuthorizeAttribute 来授权访问 Controller 操作,当用户未通过身份验证时,它会使用 302 重定向回复登录页面。 一切都很好,除了当 session 过期时,数据源读取调用静默失败,因为它们收到重定向响应而不是预期数据。 我已尝试在数据源的错误事件处理程序中处理这种情况,但在这种情况下不会调用处理程序。

这是错误处理程序:

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 数据源无法以任何方式知道这一点。由于重定向返回 200 状态代码,错误处理程序根本不会被触发。在我看来,由于响应绝不是 json 格式并且不可能被数据源绑定(bind),错误处理程序应该由 kendo 数据源触发。

无论如何...

我的解决方案是修改自定义 AuthorizeAttribute 以返回 401(未授权)状态代码,但仅针对 ajax 请求。这样,数据源错误处理程序将被调用并能够对过期 session 问题使用react。

自定义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() 位实际上刷新了页面并将浏览器置于正常的身份验证工作流程中。

关于c# - Kendo 数据源未触发重定向响应的错误处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31561508/

相关文章:

c# - 使用正则表达式进行部分搜索?

.net - 颜色 : White if background is DARK and BLACK when is LIGHT

ASP.NET core 2 充当反向代理用户重写中间件

c# - Entity Framework 模型浏览器显示存储过程两次

c# - DataGridView 自动调整和填充

c# - 如何将结构编码为指向结构的指针?

c# - 通用查找方法

.net - 跳过不兼容的库 (mkbundle)

css - MVC TextBoxFor 占位符文本对齐

asp.net-mvc - MVC 中的 SSRS Reportviewer,通过自动调整 iframe 大小以适合报表来删除 iframe 滚动条