Kendo ui 在编辑或创建剑道网格条目时检测服务器端错误

Kendo ui 在编辑或创建剑道网格条目时检测服务器端错误,kendo-ui,kendo-grid,Kendo Ui,Kendo Grid,我有一个可编辑的剑道网格来管理(创建/修改)用户帐户。编辑是在弹出窗口中完成的(相对于内联或批处理)。我有客户端验证来帮助确保向服务器提供有效的数据,但是我无法确定在服务器端创建/更新失败的情况下如何处理来自服务器的响应。我所说的“失败”并不是指HTTP 404或500的请求失败;我说的是失败,因为服务器上的脚本不喜欢数据的某些方面,并且拒绝执行 有人能告诉我如何做到这一点吗?我希望能够做的是在更新发送到服务器之后,等待响应。如果回答说一切正常,那就太好了。如果回复说有些事情进展不太顺利,我希望

我有一个可编辑的剑道网格来管理(创建/修改)用户帐户。编辑是在弹出窗口中完成的(相对于内联或批处理)。我有客户端验证来帮助确保向服务器提供有效的数据,但是我无法确定在服务器端创建/更新失败的情况下如何处理来自服务器的响应。我所说的“失败”并不是指HTTP 404或500的请求失败;我说的是失败,因为服务器上的脚本不喜欢数据的某些方面,并且拒绝执行

有人能告诉我如何做到这一点吗?我希望能够做的是在更新发送到服务器之后,等待响应。如果回答说一切正常,那就太好了。如果回复说有些事情进展不太顺利,我希望能够(A)保持弹出式编辑窗口打开并填充,(B)向用户提供有关拒绝原因的反馈。除非响应表明一切正常,否则不应将数据提交到网格。同样,编辑弹出窗口应该保持打开状态,直到服务器说OK

只要我能完成我想要的,我就可以灵活地设置服务器响应的格式

在您向我介绍剑道官方API文档之前,我已经非常了解它并每天参考它。然而,至少可以说,它是不完整的,我找不到任何与这个主题相关的东西。如果您在文档中发现了一些您认为可以帮助我的东西,那么请务必指向文档=)

根据要求,下面是我创建网格的代码

$(“#剑道用户网格”).kendoGrid({
栏目:[{
标题:“姓氏”,
字段:“lName”
},{
标题:“名字”,
字段:“fName”
},{
标题:“业务单位”,
字段:“业务单位”
},{
标题:“用户名”,
字段:“loginId”
},{
标题:“电子邮件地址”,
字段:“电子邮件”
},{
标题:“电话”,
字段:“电话”
},{
标题:“地址”,
字段:“地址”
},{
标题:“城市”,
字段:“城市”
},{
标题:“国家”,
字段:“状态”
},{
标题:“邮政编码”,
字段:“zipcode”
},{
标题:“国家”,
字段:“国家”
},{
标题:“时区”,
字段:“时区”
},{
标题:“特权”,
字段:“privs”
},{
命令:[“编辑”、“销毁”],
标题:“
}],
可滚动:false,
数据源:{
运输:{
阅读:{
url:“manageUsers.phtml”,
数据:{mode:“fetch”},
数据类型:“json”,
类型:“职位”
},
更新:{
url:“manageUsers.phtml”,
数据:{模式:“更新”},
类型:“职位”
},
销毁:{
url:“manageUsers.phtml”,
数据:{模式:“销毁”},
类型:“职位”
},
创建:{
url:“manageUsers.phtml”,
数据:{mode:“create”},
类型:“职位”
},
批次:假
},
模式:{
数据:“记录”,
总计:“总计”,
型号:{
id:“用户id”,
字段:{
userId:{editable:false,nullable:true},
lName:{type:“string”,可编辑:true,验证:{required:true},
fName:{type:“string”,可编辑:true,验证:{required:true},
业务单元:{type:“string”,可编辑:true,验证:{required:true},
loginId:{type:“string”,验证:{required:true},
电子邮件:{type:“string”,验证:{required:true},
电话:{type:“string”},
地址:{type:“string”},
城市:{type:“string”},
状态:{type:“string”},
zipcode:{type:“string”},
国家:{type:“string”},
时区:{type:“string”},
privs:{type:“string”}
}
}
},
页面大小:20,
服务器分页:false,
服务器筛选:false,
服务器排序:false
},
可过滤:正确,
可排序:是的,
pageable:对,
可编辑:{
模式:“弹出”,
模板:kendo.template($(“#kendo_edit_user_template”).html())
},
工具栏:[“创建”、“保存”、“取消”]
});

有两点需要记住:

  • 服务器响应中包含服务器端错误的字段
  • 是一个在发生错误时将被激发的事件
  • 基本上你需要:

  • 向架构中添加一个
    错误
    定义,该定义提供对从服务器返回的状态的访问
  • 实现
    error
    事件处理程序,例如,还原以前的值
  • 如果您的服务器在名为
    myError
    的字段中返回错误消息,则您可能会遇到如下情况:

    schema: {
        errors: "myError", 
        data: "records",
        total: "total",
        model: {
            id: "userId",
            fields: {
                userId: { editable: false, nullable: true },
                lName: { type: "string", editable: true, validation: { required: true } },
                fName: { type: "string", editable: true, validation: { required: true } },
        ...
    
    或:

    活动将是:

    dataSource: {
        error : function (e) {
            if (e.errors !== false) {
                alert("Error: " + e.errors);
                // This will cancel any change done
                this.cancelChanges();
            }
        },
        transport: {
            read: {
                url: "manageUsers.phtml",
                data: { mode: "fetch" },
                dataType: "json",
                type: "POST"
            },
    
    编辑:如果要保持弹出窗口打开,应执行以下操作:

    dataSource: {
        error : function (e) {
            if (e.errors !== false) {
                alert("Error: " + e.errors);
                // This will keep the popup open
                grid.one("dataBinding", function (e) {
                    e.preventDefault();   // cancel grid rebind
                });
            }
        },
        transport: {
            read: {
                url: "manageUsers.phtml",
                data: { mode: "fetch" },
                dataType: "json",
                type: "POST"
            },
    

    我使用

    绑定到数据绑定事件一次,你能发布一些你已经有的代码吗?我已经更新了我的帖子,添加了我用来创建网格的代码。谢谢@OnaBai!我不知道存在
    Schema.errors
    ,我认为
    dataSource.error
    是针对HTTP错误的,但很高兴了解到其他错误!我还没有弄清楚的另一个问题是如何保持编辑弹出窗口的打开状态,直到确认成功为止。使用
    this.cancelChanges()
    d
    dataSource: {
        error : function (e) {
            if (e.errors !== false) {
                alert("Error: " + e.errors);
                // This will keep the popup open
                grid.one("dataBinding", function (e) {
                    e.preventDefault();   // cancel grid rebind
                });
            }
        },
        transport: {
            read: {
                url: "manageUsers.phtml",
                data: { mode: "fetch" },
                dataType: "json",
                type: "POST"
            },