尽管我仍然无法将行数据保存到服务器,但与jqgrid一起到达那里
我的微型应用程序为每一行创建按钮,从而调用googlemaps地理编码。
地理编码将返回的数据填写在我的页面上的表单中。
我有3个单独的表单字段,每个表单字段都有自己的按钮,因此用户可以使用正确的地址更新行,每个按钮的rel都更改为刚刚执行地理编码的行的id。
我的按钮具有此功能:
编辑 - - - - - - -
我已更改代码以尝试从saveRow获取响应
如果我警告saveRow它返回false,则在Firebug中看不到任何AJAX调用正在生成,
我尝试放置一个错误函数来捕获错误,但是似乎没有被调用。
Oleg指出数据库中有多个ID,但这是不可能的,因为它是主键自动编号。
我没有看到对我的server.php的请求来更新被调用的记录。
$('body').delegate('#displayaddr_btn', 'click', function(){
myID = $(this).attr('rel');
myLat = $('#lat').val();
myLng = $('#lng').val();
myAddress = $('#displayaddr').val();
alert('ID:'+myID+' myLat: '+myLat+' myLng: '+myLng+' Addt: '+myAddress);
jQuery("#rowed2").jqGrid('setRowData',myID,{ lat_mdt:myLat, lng_mdt:myLng, displayaddr_mdt:myAddress });
alert(jQuery(“#rowed2”)。jqGrid('saveRow',myID)
jQuery(“#rowed2”)。jqGrid('saveRow',myID,
{errorfunc:function(id,error){
alert('saveRow()中存在错误-ID:'+ id +'错误:'+ error);
}
});
})
警报似乎没有发生任何输出所有应有的信息,但是我看不到要更新记录的处理页面的调用。
------------更新以响应Oleg ---------------------------------------------
嗨,奥列格(Oleg),感谢您抽出宝贵的时间,确实我的php文件中存在记录更新错误,
现在已固定,输出键数:4与值数匹配:4my update = UPDATE mapdata_mdt SET idetp_mdt = 0,geoaddr_mdt ='n11hl',active_mdt = 0,flag_mdt = 0 WHERE id_mdt = 1343是我输入的代码php页面,这是我的预期输出。
实际上,网格上的编辑功能可以按预期工作:
我的问题是当我尝试从jqrid外部的按钮运行
saveRow()
时。当按下网格行的“ geo”按钮时,将在网格下方生成按钮(其中的3个))
这是我在单击按钮时遇到问题的地方,
saveRow()
返回false,从我可以看到对server.php的调用甚至没有进行,因此我无法调试任何响应。(我以前没有使用过ASP.NET MVC的WFC,ASMX Web服务,并且现在不想使事情复杂化!)
缺少什么? Test URL
(对列表中第一个称为TEST的记录进行地理编码以填充表格,然后单击相应文本字段的保存按钮之一)
这是我的所有代码:
function setAddrButtons(myID, mylat, mylng){
alert(' setaddrButtons----ID:'+myID+' myLat: '+myLat+' myLng: '+myLng+' Addt: '+myAddress);
$('#displayaddr_btn').attr('rel', myID);
$('#revlook_btn').attr('rel', myID);
$('#altaddr_btn').attr('rel', myID);
$('#lat').val(mylat);
$('#lng').val(mylng);
}
//jquery grid stuff
$('body').delegate('#displayaddr_btn', 'click', function(){
myID = $(this).attr('rel');
myLat = $('#lat').val();
myLng = $('#lng').val();
myAddress = $('#displayaddr').val();
alert('ID:'+myID+' myLat: '+myLat+' myLng: '+myLng+' Addt: '+myAddress);
alert(jQuery("#rowed2").jqGrid('saveRow',myID)
jQuery("#rowed2").jqGrid('saveRow',myID,
{errorfunc:function(id, error){
alert('there was an error in saveRow()- ID:'+id+' Error: '+error);
}
});
})
$('body').delegate('#revlook_btn', 'click', function(){
myID = $(this).attr('rel');
myLat = $('#lat').val();
myLng = $('#lng').val();
myAddress = $('#revlook').val();
alert('ID:'+myID+' myLat: '+myLat+' myLng: '+myLng+' Addt: '+myAddress);
jQuery("#rowed2").jqGrid('setRowData',myID,{ lat_mdt:myLat, lng_mdt:myLng, displayaddr_mdt:myAddress });
alert(jQuery("#rowed2").jqGrid('saveRow',myID)
jQuery("#rowed2").jqGrid('saveRow',myID,
{errorfunc:function(id, error){
alert('there was an error in saveRow()- ID:'+id+' Error: '+error);
}
});
})
$('body').delegate('#altaddr_btn', 'click', function(){
myID = $(this).attr('rel');
myLat = $('#lat').val();
myLng = $('#lng').val();
myAddress = $('#altaddr').val();
alert('ID:'+myID+' myLat: '+myLat+' myLng: '+myLng+' Addt: '+myAddress);
alert(jQuery("#rowed2").jqGrid('saveRow',myID)
jQuery("#rowed2").jqGrid('saveRow',myID,
{errorfunc:function(id, error){
alert('there was an error in saveRow()- ID:'+id+' Error: '+error);
}
});
})
myGrid = jQuery("#rowed2").jqGrid({
url:'data/stokistdata_s_json.php?q=3',
datatype: "json",
mtype: "POST",
rowNum:10,
rowList:[50,100,150,200,300,400,500,600],
pager: '#prowed2',
sortname: 'name_mdt',
viewrecords: true,
gridview:true,
sortorder: "asc",
rowNum:50,
scroll: true,
editurl: "data/server.php",
caption:"Stockist's and Orchid days",
colNames:[
'Actions',
'id',
'Type',
'Name',
'Geo Address',
'Display Address',
'Telephone',
'Email',
'website',
'lat',
'lng',
'flag',
'description',
'active'
],
colModel:[{
name:'Actions',
index:'Actions',
width:100,
sortable:false,
search:false
}, {
name:'id_mdt',
index:'id_mdt',
width:15,
align:"left",
sortable:true,
search:false,
hidden: true,
editable: true,
editrules: { edithidden: true },
editoptions:{readonly:true},
hidedlg: true,
key: true
}, {
name:'id_etp',
index:'id_etp',
width:90,
align:"left",
sortable:true,
editable:true,
edittype:"select",
formatter:'select',
editoptions:{value:{1:'Stokist',0:'Orchid Day'}},
editrules:{required:true},
search:true,
stype:'select',
sopt: ['eq'],
searchoptions:{value:{'':'All',1:'Stockist',2:'Orchid Day'}}
},{
name:'Name_mdt',
index:'Name_mdt',
align:"left",
width:150,
editable:true,
editrules:{required:true},
search:true,
stype:'text',
sopt:['cn']
}, {
name:'geoaddr_mdt',
index:'geoaddr_mdt',
width:150,
align:"left",
editable:true,
search:false,
edittype:"textarea",
editoptions:{rows:"3",cols:"30"}
}, {
name:'displayaddr_mdt',
index:'displayaddr_mdt',
width:150,
align:"left",
editable:true,
search:false,
edittype:"textarea",
editoptions:{rows:"3",cols:"30"}
}, {
name:'telephone_mdt',
index:'telephone_mdt',
width:80,
align:"left",
editable:true,
search:false
}, {
name:'email_mdt',
index:'email_mdt',
editrules:{email:true, required:false},
width:80,
align:"left",
sortable:false,
editable:true,
search:false
}, {
name:'website_mdt',
index:'website_mdt',
editrules:{url:true, required:false},
width:80,
align:"left",
sortable:false,
editable:true,
search:false
}, {
name:'lat_mdt',
index:'lat_mdt',
width:40,
align:"left",
sortable:false,
editable:true,
search:false
} , {
name:'lng_mdt',
index:'lng_mdt',
width:40,
align:"left",
sortable:false,
editable:true,
search:false
}, {
name:'flag_mdt',
index:'flag_mdt',
width:20,
align:"left",
sortable:true,
editable:true,
edittype:"select",
editoptions: {value:{1:'Flagged',0:'No Flag'}},
search:true,//
stype:'select',
searchoptions:{value:{'':'All',1:'Flagged',0:'No Flag'}}//{value:":Both;1:Flagged;0:No Flag"}
}, {
name:'description_mdt',
index:'description_mdt',
width:150,
align:"left",
sortable:false,
editable:true,
search:false,
edittype:"textarea",
editoptions:{rows:"3",cols:"30"}
}, {
name:'active_mdt',
index:'active_mdt',
width:20,
align:"left",
sortable:true,
editable:true,
edittype:"select",
editoptions: {value:{1:'Active',0:'Hidden'}},
search:true,//
stype:'select',
searchoptions:{value:{'':'All','1':'Active','0':'Hidden'}} //{value:":Both;1:Active;0:Hidden"}
}], search : {
caption: "Search...",
Find: "Find",
Reset: "Reset",
matchText: " match",
rulesText: " rules"
},
gridComplete: function(){
var ids = jQuery("#rowed2").jqGrid('getDataIDs');
for(var i=0;i < ids.length;i++){
var cl = ids[i];
be = "<input style='height:22px;width:20px;' type='button' value='E' alt='Edit Location' onclick=\"jQuery('#rowed2').editGridRow('"+cl+"');\" />";
se = "<input style='height:22px;width:20px;' type='button' value='S' onclick=\"jQuery('#rowed2').saveRow('"+cl+"');\" />";
ce = "<input style='height:22px;width:20px;' type='button' value='C' onclick=\"jQuery('#rowed2').restoreRow('"+cl+"');\" />";
fl = "<input style='height:22px;width:50px;' type='button' value='Find' alt='Find Location' class='findMe' rel='"+cl+"' />";
gc = "<input style='height:22px;width:50px;' type='button' value='Geo' class='geocodeMe' rel='"+cl+"' />";
jQuery("#rowed2").jqGrid('setRowData',ids[i],{Actions:fl+gc});
}
}
});
jQuery("#rowed2").jqGrid('navGrid',"#prowed2",
{edit:true,add:true,del:true,search:true,refresh:true},
{closeOnEscape:true, recreateForm: true, width:500},
{closeOnEscape:true, recreateForm: true, width:500} // Add options
);
myGrid.jqGrid('filterToolbar',{defaultSearch:'cn',stringResult:true});
最佳答案
我尝试了您的test URL,并根据Fiddler跟踪了第一行的编辑结果。
如果我编辑网格的第一行并在“名称”字段中键入“ test”文本,我会看到jqGrid向服务器发送了包含数据的HTTP POST请求
id_mdt=1343&id_etp=0&Name_mdt=test&geoaddr_mdt=n11hl&displayaddr_mdt=&telephone_mdt=&email_mdt=&website_mdt=&lat_mdt=&lng_mdt=&flag_mdt=0&description_mdt=&active_mdt=0&oper=edit&id=1343
数据包含所有可编辑文件名的包含以及两个附加参数
oper=edit
和id=1343
(与id_mdt=1343
相同)。如果成功,您的服务器应使用任何成功的HTTP代码进行修改和响应,如果数据更新失败,则应使用错误的HTTP代码进行修改和响应。您的服务器响应以标头开头HTTP/1.1 200 OK
Content-Type: text/html
并在体内
Number of keys: 4 matches number of values: 4my update = UPDATE mapdata_mdt SET idetp_mdt = 0,geoaddr_mdt = 'n11hl',active_mdt = 0,flag_mdt = 0 WHERE id_mdt = 1343<br />
<b>Notice</b>: Undefined variable: growthConn in <b>E:\Domains\f\focus-on-plants.com\user\htdocs\admin\stokists\data\server.php</b> on line <b>137</b><br />
<br />
<b>Warning</b>: mysql_query(): supplied argument is not a valid MySQL-Link resource in <b>E:\Domains\f\focus-on-plants.com\user\htdocs\admin\stokists\data\server.php</b> on line <b>137</b><br />
所以可以看到很多问题:
可以将响应中的文本“键数:4个匹配”解释为
id_mdt
不是相应数据库表中的主键,因为存在一个包含id_mdt
的数据项。您应该验证数据库的设计。奇怪的错误消息显示更新失败。您应该检查
E:\Domains\f\focus-on-plants.com\user\htdocs\admin\stokists\data\server.php
服务器代码的第137行。您应该更改代码,以便在出错时将任何error HTTP code放置在服务器响应中。
我自己没有使用PHP,因此无法给您更确切的建议,但是对我来说很明显,首先您应该在服务器代码中搜索错误。
再说一遍。从服务器头中可以看到您使用Microsoft IIS 7.0作为Web服务器。为什么不使用站点的ASP.NET MVC的WFC,ASMX Web服务?无论如何,我都应该在Web服务器上打开动态和静态包含的compression。这将改善站点的性能。另外,您应该考虑更改当前在
gridComplete
中使用的代码以提高性能。有很多选择。看看here。例如,here和here(在最后一个答案中,性能和事件绑定部分很重要;可以通过按钮链接替换自定义格式器)。更新:在我看来,您的下一个问题是您尝试使用saveRow只是将有关行的信息发布到服务器。
saveRow
发布内联编辑模式中有关行的信息,因此在editRow调用之后。 editRow与其他内容一起使用以下代码将editable="1"
属性添加到该行(添加到<tr>
元素):$("#"+rowid).attr("editable","1");
在接近saveRow测试开始处,尝试保存的行具有属性。它不是返回并且什么也不做。
关于jquery - jqgrid saveRow不进行ajax调用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6175023/