jquery-easyui中griddata刷新报错的问题 本帖最后由 ighack 于 2012-06-13 14:40:22 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 我是按照datagrid的json格式传的 我发现如果,一开始给url,符值真接获取数据,一旦找不到数据就会出错 那就要看你请求的路径所返回的json数据了你这个url(url: '../../HttpHandler/Jc_Storage.ashx?method=select')所返回的json应该至少要有rows属性也就是说你返回的json至少是要这样的 {rows:[]} 格式不介意的话最好能贴出你的返回数据的代码 也就是 HttpHandler/Jc_Storage.ashx?method=select 里的代码... 先说说我的: $('#tt').datagrid({ width: 660, height: 600, singleSelect: true, collapsible: true, idField: 'ODRD140_ORDERNO', url: 'Handler.ashx', loadMsg: '正在加载数据...', columns: [[ { field: 'ODRD140_ORDERNO', title: '序号', width: 150 }, { field: 'ODRD140_ITEMQTY', title: '商品数量', width: 180, editor: 'text' }, { field: 'ODRD140_STAT', title: '状态', width: 180, editor: 'text' } ]], pagination: true, rownumbers: true });Handler.ashx的代码:public class Handler : IHttpHandler { public void ProcessRequest (HttpContext context) { context.Response.ContentType = "text/plain"; string json = "{\"total\":1,\"rows\":[{\"ODRD140_ORDERNO\":\"0001\",\"ODRD140_ITEMQTY\":\"100\",\"ODRD140_STAT\":\"已审核\"}]}"; context.Response.Write(json); } public bool IsReusable { get { return false; } }一直不停点击datagrid的刷新按钮,有时就报和LZ一样的错,求高手解决下啊~~ 我刚用项目试了下 发现也会出现null为空或不是对象可是如果我在datagrid里加了个onLoadSuccess:function(data){} 就不出来了 你可以试下具体我也不知道该怎么去解释 等回复吧还是... 谢谢~好的我去试试。我发现在Handler.ashx 中最后添加代码:context.Response.Flush();基本也不会报错了~ 这样啊 主要是吧 我在chrome和opera完全没有问题的 就是ie里有 而且感觉本身ie对jquery的解析就很郁闷 不知道会不会是因为这个呢... 待解释... 我也遇到,在IE8 下刷新的时候,10次有一次是没有数据的,提示null对象,firefox下比较稳定,在返回的JSON中加{total:row[]}格式,都是没有用的,于是在OnLoadSuccess:函数中尝试捕获data(JSON格式),正常时能捕获到,非正常的时候,不能捕获,我的推断是这样的:因为收不到服务端的json数据导致填充grid失败,所以才会有null的错误,如果能够先于datagrid之前捕获服务端的数据,就好判断究竟是服务器端数据传输问题,还是datagrid在收到json后,处理json填充datagrid过程中出现问题。这个问题不解决,easyui使用就比较麻烦。 调试了一下,将问题分阶段分析:1.服务器端送出Json数据到客户端-->2.datagrid接收Json数据-->3.Json数据填充到datagrid。分别在三个阶段设立断点后,检查发现出现null错误时,1步骤是正常的,客户端能获取到Json数据,说明数据能到目的地,与服务器无关。但在datagrid方法loadfilter事件中,参数data此时是Null值,正常情况下,loadfilter是填充datagrid前最后一个方法(用于过滤处理),如若data是null,说明问题在datagrid接收Json数据异常,所以加载失败继而出现以上问题。解决方法:既然这是个偶然发生的异常,但为了保证在IE 下100%的准确,先不要寻找datagrid内部问题,即便发现了,修改datagrid内核带来其他风险还是很大的,所以,我在loadFilter中增加判断,来避免问题发生:$.extend($.fn.datagrid.defaults, { loadFilter: function (data) { if (data == null) { alert('读取有问题,重新填充'); data = $(this).datagrid("reload"); } return data;}); 楼上正解,但好像DATA==NULL时,RELOAD也会报错。我这样改了一下,看看行不loadFilter: function (data) { if (data == null) { $(this).datagrid("load"); return $(this).datagrid("getData"); } ...//pager function}) loadFilter: function (data) { if (data == null) { $("#").datagrid("load"); return false; // 我觉得这里不需要再去返回一个值 }})比较幸运的是我目前没有遇到这个问题,我的写法可能和诸位的有点小区别 //显示数据 $(function () { BindEmpGrid(); }); function BindEmpGrid() { $('#EmpListGrid').datagrid({ url: '../Ashx/DeptAjax.ashx?op=select', singleSelect: true, columns: [[ { field: 'DeptGUID', title: '##', width: 100, align: 'center', sortable: true, hidden: true }, { field: 'GUID', title: '#, width: 100, align: 'center', sortable: true, hidden: true }, { field: 'DName', title: '*', sortable: true, width: 100, align: 'center' } ]] }); } //新增 function newDept() { title = ""; $("#dlgDept").dialog('open').dialog('setTitle', title); $("#Deptfm").form('clear'); guids = ""; urlAddr = "../.../..Ajax.ashx?op=add"; } //编辑显示窗口 function editDept() { var row = $("#EmpListGrid").datagrid('getSelected'); if (row) { title = ""; $("#").dialog('open').dialog('setTitle', title); $("#").form('clear'); $("#").form('load', row); $('#').combogrid('grid').datagrid('reload'); var EUrl = '.././..Ajax.ashx?op=GetMaster&EGUID=' + ..; } else { $.messager.alert('提示', '请选择数据行进行编辑!'); } } //删除 function Remove() { var row = $("#EmpListGrid").datagrid('getSelected'); if (row) { $.messager.confirm('Confirm', '您确定要删除该数据吗?', function (r) { if (r) { ... $.post('.././..Ajax.ashx?op=delete', { "objs": JSON.stringify(objs, function (k, v) { return v === "" ? "" : v }), "object": JSON.stringify(object, function (k, v) { return v === "" ? "" : v }) }, function (result) { if (result.Success) { $("#EmpListGrid").datagrid('reload'); } else { $.messager.alert('提示', '操作失败!'); } }, 'json'); } }); } else { $.messager.defaults = { ok: "确定", cancel: "取消" }; $.messager.alert('提示', '请选择数据行进行操作!'); } } //保存 function saveDept() { //获取编辑数据 if (.. == "") { $.messager.alert('提示', '不能为空!'); return false; } else { var row = $("#EmpListGrid").datagrid('getSelected'); if (row) { DeptGUID = row.GUID; } $.post('../Ashx/DeptAjax.ashx?op=selectAll', function (result) { if (!result.Success) { $.messager.alert('提示', result.Message); return false; } else { var objs = { ... }; var obj = { ... }; if (title == "") { $.post('../../.Ajax.ashx?op=AddMaster', { "obj": JSON.stringify(obj, function (k, v) { return v === "" ? "" : v }), "objs": JSON.stringify(objs, function (k, v) { return v === "" ? "" : v }) }, function (result) { if (!result.Success) { return false; } else { $("#").dialog('close'); $('#EmpListGrid').datagrid('reload'); } }, 'json'); } else if (title == "") { var object = { ... }; $.post('../Ashx/DeptAjax.ashx?op=update', { "obj": JSON.stringify(obj, function (k, v) { return v === "" ? "" : v }), "objs": JSON.stringify(objs, function (k, v) { return v === "" ? "" : v }), "object": JSON.stringify(object, function (k, v) { return v === "" ? "" : v }) }, function (result) { if (!result.Success) { return false; } else { $("#dlgDept").dialog('close'); $('#EmpListGrid').datagrid('reload'); } }, 'json'); } } }, 'json'); } }大家参考参考!!! 我也遇到 同样问题 求解 ?我的问题可能有点不同 所有IE版本均提示 SCRIPT5007: 无法获取未定义或 null 引用的属性“length” 火狐 chrome 等其他浏览器没有任何错误我更换服务器 测试在IIS 下 出现如上问题apache下 一切正常 IE浏览也正常有可能是服务器编码哪里的问题具体我也不知道 找不到根本原因实在不行只有换服务器了 这个问题,我也不是很清楚,我不知道你的代码是什么样子的,大胆猜测有三个原因:第一个可能是偶发性,我解决不了,第二个就是你看看是不是加载的时候, $("#EmpListGrid").datagrid('reload'); 这段代码中的id在整个项目中是不是唯一的,如果不是唯一的,而且被预编译的话,就可能出现没有数据甚至是报错,第三个原因就是你所打开的页面或者是窗口在构造的时候到底是不是唯一的,这个你得自己来调试,如果不是唯一的就不会再你所看到的页面显示数据,可能是某个隐藏的页面了,关于是不是唯一的页面出现的原因有两个,一个是构造了多个,另一个是关闭该页面的时候木有销毁该页面,也就是说关闭的效果木有,该页面只是相当于隐藏了,当你在打开这个页面是就也不会显示数据以上都是我分析的情况,可能不对,可能不符,大家在研究研究哈 你们是不是都用的是.net MVC? 我也遇到过 在VS里调试各种报错 ,发布到IIS上就没问题了,请大家弄到IIS上试试 正解,谢谢!当页面刷新时,html很快就刷出来,而异步执行的方法还没返回数据,就会出现这样的问题。 22楼是正解,method改为Get之后就没事了 用的22楼的方法,有效。 $('#positionInfo').datagrid({ url: "handlers/getXXLX.ashx", method:"get", fitColumns: true, //设置为true将自动使列适应表格宽度以防止出现水平滚动,false则自动匹配大小 loadMsg: "正在努力为您加载数据", //加载数据时向用户展示的语句 pagination: true, //显示最下端的分页工具栏 pageSize: 10, //读取分页条数,即向后台读取数据时传过去的值 pageList: [10, 20, 30], //可以调整每页显示的数据,即调整pageSize每次向后台请求数据时的数据 columns: [[ { field: 'LineName', title: '线路名称', width: 100, sortable: true }, { field: 'LineID', title: '线路编码', width: 100 }, { field: 'IDPostName', title: 'Id位置名称', width: 100 } ]] }); $('#positionInfo').datagrid('reload'); ie6 加载js超慢 关于SQL Vulnarability攻击怎么修改 关于TEXTAREA最大字数的问题 把json数据类型,作为参数,传递给js文件 求一js aClass.Create.apply(this, aParams); 急,请问javascript对象的问题? 求一正则表达式 限制以英文發表文章(全型字列入中文字範圍) js判断段文本框的内容(没分了大家帮个忙吧) 如果在firefox下获得鼠标坐标?? iframe中ajax轮询请求问题 easyui datagrid能否实现动态表头 动态标题,如附图那样
你这个url(url: '../../HttpHandler/Jc_Storage.ashx?method=select')所返回的json应该至少要有rows属性
也就是说你返回的json至少是要这样的 {rows:[]} 格式
不介意的话最好能贴出你的返回数据的代码 也就是 HttpHandler/Jc_Storage.ashx?method=select 里的代码...
width: 660,
height: 600,
singleSelect: true,
collapsible: true,
idField: 'ODRD140_ORDERNO',
url: 'Handler.ashx',
loadMsg: '正在加载数据...',
columns: [[
{ field: 'ODRD140_ORDERNO', title: '序号', width: 150 },
{ field: 'ODRD140_ITEMQTY', title: '商品数量', width: 180, editor: 'text' },
{ field: 'ODRD140_STAT', title: '状态', width: 180, editor: 'text' } ]],
pagination: true,
rownumbers: true
});Handler.ashx的代码:
public class Handler : IHttpHandler {
public void ProcessRequest (HttpContext context)
{
context.Response.ContentType = "text/plain";
string json = "{\"total\":1,\"rows\":[{\"ODRD140_ORDERNO\":\"0001\",\"ODRD140_ITEMQTY\":\"100\",\"ODRD140_STAT\":\"已审核\"}]}";
context.Response.Write(json);
}
public bool IsReusable {
get {
return false;
}
}一直不停点击datagrid的刷新按钮,有时就报和LZ一样的错,求高手解决下啊~~
可是如果我在datagrid里加了个onLoadSuccess:function(data){} 就不出来了 你可以试下
具体我也不知道该怎么去解释 等回复吧还是...
谢谢~好的我去试试。
我发现在Handler.ashx 中最后添加代码:
context.Response.Flush();
基本也不会报错了~
在返回的JSON中加{total:row[]}格式,都是没有用的,于是在OnLoadSuccess:函数中尝试捕获data(JSON格式),正常时能捕获到,非正常的时候,不能捕获,
我的推断是这样的:因为收不到服务端的json数据导致填充grid失败,所以才会有null的错误,如果能够先于datagrid之前捕获服务端的数据,就好判断究竟是服务器端数据传输问题,还是datagrid在收到json后,处理json填充datagrid过程中出现问题。
这个问题不解决,easyui使用就比较麻烦。
1.服务器端送出Json数据到客户端-->
2.datagrid接收Json数据-->
3.Json数据填充到datagrid。
分别在三个阶段设立断点后,检查发现出现null错误时,1步骤是正常的,客户端能获取到Json数据,说明数据能到目的地,与服务器无关。但在datagrid方法loadfilter事件中,参数data此时是Null值,正常情况下,loadfilter是填充datagrid前最后一个方法(用于过滤处理),如若data是null,说明问题在datagrid接收Json数据异常,所以加载失败继而出现以上问题。
解决方法:既然这是个偶然发生的异常,但为了保证在IE 下100%的准确,先不要寻找datagrid内部问题,即便发现了,修改datagrid内核带来其他风险还是很大的,所以,我在loadFilter中增加判断,来避免问题发生:$.extend($.fn.datagrid.defaults, {
loadFilter: function (data) {
if (data == null) {
alert('读取有问题,重新填充');
data = $(this).datagrid("reload");
}
return data;
});
loadFilter: function (data) {
if (data == null) {
$(this).datagrid("load");
return $(this).datagrid("getData");
}
...//pager function
})
loadFilter: function (data) {
if (data == null) {
$("#").datagrid("load");
return false; // 我觉得这里不需要再去返回一个值
}
})
比较幸运的是我目前没有遇到这个问题,我的写法可能和诸位的有点小区别
//显示数据
$(function () {
BindEmpGrid();
}); function BindEmpGrid() {
$('#EmpListGrid').datagrid({
url: '../Ashx/DeptAjax.ashx?op=select',
singleSelect: true,
columns: [[
{ field: 'DeptGUID', title: '##', width: 100, align: 'center', sortable: true, hidden: true },
{ field: 'GUID', title: '#, width: 100, align: 'center', sortable: true, hidden: true },
{ field: 'DName', title: '*', sortable: true, width: 100, align: 'center' }
]]
});
} //新增
function newDept() {
title = "";
$("#dlgDept").dialog('open').dialog('setTitle', title);
$("#Deptfm").form('clear');
guids = "";
urlAddr = "../.../..Ajax.ashx?op=add";
} //编辑显示窗口
function editDept() {
var row = $("#EmpListGrid").datagrid('getSelected');
if (row) {
title = "";
$("#").dialog('open').dialog('setTitle', title);
$("#").form('clear');
$("#").form('load', row);
$('#').combogrid('grid').datagrid('reload');
var EUrl = '.././..Ajax.ashx?op=GetMaster&EGUID=' + ..;
} else {
$.messager.alert('提示', '请选择数据行进行编辑!');
}
} //删除
function Remove() {
var row = $("#EmpListGrid").datagrid('getSelected');
if (row) {
$.messager.confirm('Confirm', '您确定要删除该数据吗?', function (r) {
if (r) {
...
$.post('.././..Ajax.ashx?op=delete', { "objs": JSON.stringify(objs, function (k, v) { return v === "" ? "" : v }), "object": JSON.stringify(object, function (k, v) { return v === "" ? "" : v }) }, function (result) {
if (result.Success) {
$("#EmpListGrid").datagrid('reload');
} else {
$.messager.alert('提示', '操作失败!');
}
}, 'json');
}
});
} else {
$.messager.defaults = { ok: "确定", cancel: "取消" };
$.messager.alert('提示', '请选择数据行进行操作!');
}
} //保存
function saveDept() {
//获取编辑数据
if (.. == "") {
$.messager.alert('提示', '不能为空!');
return false;
}
else {
var row = $("#EmpListGrid").datagrid('getSelected');
if (row) {
DeptGUID = row.GUID;
}
$.post('../Ashx/DeptAjax.ashx?op=selectAll', function (result) {
if (!result.Success) {
$.messager.alert('提示', result.Message);
return false;
}
else {
var objs = {
...
};
var obj = {
...
};
if (title == "") {
$.post('../../.Ajax.ashx?op=AddMaster', { "obj": JSON.stringify(obj, function (k, v) { return v === "" ? "" : v }), "objs": JSON.stringify(objs, function (k, v) { return v === "" ? "" : v }) }, function (result) {
if (!result.Success) {
return false;
} else {
$("#").dialog('close');
$('#EmpListGrid').datagrid('reload');
}
}, 'json');
} else if (title == "") {
var object = {
...
};
$.post('../Ashx/DeptAjax.ashx?op=update', { "obj": JSON.stringify(obj, function (k, v) { return v === "" ? "" : v }), "objs": JSON.stringify(objs, function (k, v) { return v === "" ? "" : v }), "object": JSON.stringify(object, function (k, v) { return v === "" ? "" : v }) }, function (result) {
if (!result.Success) {
return false;
} else {
$("#dlgDept").dialog('close');
$('#EmpListGrid').datagrid('reload');
}
}, 'json');
}
}
}, 'json');
}
}大家参考参考!!!
SCRIPT5007: 无法获取未定义或 null 引用的属性“length” 火狐 chrome 等其他浏览器没有任何错误我更换服务器 测试在IIS 下 出现如上问题
apache下 一切正常 IE浏览也正常有可能是服务器编码哪里的问题
具体我也不知道 找不到根本原因
实在不行只有换服务器了
这个问题,我也不是很清楚,我不知道你的代码是什么样子的,大胆猜测有三个原因:第一个可能是偶发性,我解决不了,第二个就是你看看是不是加载的时候, $("#EmpListGrid").datagrid('reload'); 这段代码中的id在整个项目中是不是唯一的,如果不是唯一的,而且被预编译的话,就可能出现没有数据甚至是报错,第三个原因就是你所打开的页面或者是窗口在构造的时候到底是不是唯一的,这个你得自己来调试,如果不是唯一的就不会再你所看到的页面显示数据,可能是某个隐藏的页面了,关于是不是唯一的页面出现的原因有两个,一个是构造了多个,另一个是关闭该页面的时候木有销毁该页面,也就是说关闭的效果木有,该页面只是相当于隐藏了,当你在打开这个页面是就也不会显示数据
以上都是我分析的情况,可能不对,可能不符,大家在研究研究哈
正解,谢谢!
当页面刷新时,html很快就刷出来,而异步执行的方法还没返回数据,就会出现这样的问题。
url: "handlers/getXXLX.ashx",
method:"get",
fitColumns: true, //设置为true将自动使列适应表格宽度以防止出现水平滚动,false则自动匹配大小
loadMsg: "正在努力为您加载数据", //加载数据时向用户展示的语句
pagination: true, //显示最下端的分页工具栏
pageSize: 10, //读取分页条数,即向后台读取数据时传过去的值
pageList: [10, 20, 30], //可以调整每页显示的数据,即调整pageSize每次向后台请求数据时的数据
columns: [[
{ field: 'LineName', title: '线路名称', width: 100, sortable: true },
{ field: 'LineID', title: '线路编码', width: 100 },
{ field: 'IDPostName', title: 'Id位置名称', width: 100 }
]] });
$('#positionInfo').datagrid('reload');