jqgrid:如何在编辑模式下发送和接收行数据
jqGrid有员工姓名和员工id列 如果员工姓名已更改,则应调用服务器验证方法来验证姓名。应根据此方法返回的数据更新当前行列 如果员工id已更改,则应调用服务器验证方法来验证id。 应根据此方法返回的数据更新当前行列 jqGrid最好保持编辑模式,以便用户可以继续更改、接受或拒绝更改 如何在内联和表单编辑中实现这一点? 我在考虑以下可能性: 可能性1 将editrules与自定义验证器一起使用,如jqgrid:如何在编辑模式下发送和接收行数据,jqgrid,Jqgrid,jqGrid有员工姓名和员工id列 如果员工姓名已更改,则应调用服务器验证方法来验证姓名。应根据此方法返回的数据更新当前行列 如果员工id已更改,则应调用服务器验证方法来验证id。 应根据此方法返回的数据更新当前行列 jqGrid最好保持编辑模式,以便用户可以继续更改、接受或拒绝更改 如何在内联和表单编辑中实现这一点? 我在考虑以下可能性: 可能性1 将editrules与自定义验证器一起使用,如 editrules = new {
editrules = new
{
custom = true,
custom_func = function(value, colname) { ??? }
},
editrules = new
{
custom = true,
custom_func = function(value, colname) { ??? }
},
问题:如何从所有列获取数据、进行同步或异步调用以及使用此调用结果更新列
可能性2
要求用户按Enter键保存行。
问题:如何找到已更改的列并将此列号传递给服务器。
如何从服务器响应更新当前行数据
可能性3
如中的Oleg great answer中所述使用模糊
问题:如果输入数据并立即按enter键,则不会触发模糊。在这种情况下如何应用模糊
总之,服务器sice计算/验证应按如下方式进行:
若更改了列中的列,并在更改的列中按了“移出焦点”或“回车”以保存,则服务器端同步,若不可能,则应调用异步方法。更改的列名和编辑方法中的当前编辑行值作为参数传递给此方法
此方法返回已编辑行的新值。当前编辑的行值应替换为该方法返回的值
更新
Oleg answer假设主键已修改。这个因素并不重要。以下是问题的新版本,没有主键和其他更新:
jqGrid具有产品条形码和产品名称列
如果产品名称
已更改,则应调用服务器验证方法来验证名称。应根据此方法返回的数据更新当前行列
如果产品条码
已更改,则应调用服务器验证方法来验证产品条码。
应根据此方法返回的数据更新当前行列
jqGrid应保持编辑模式,以便用户可以继续更改、接受或拒绝更改
如何在内联和表单编辑中实现这一点?
我在考虑以下可能性:
可能性1
将editrules与自定义验证器一起使用,如
editrules = new
{
custom = true,
custom_func = function(value, colname) { ??? }
},
editrules = new
{
custom = true,
custom_func = function(value, colname) { ??? }
},
问题:如果输入元素失去焦点,自定义函数不会激发。它在保存所有元素之前被调用。所以它不能被使用
可能性2
要求用户按Enter键保存行。
问题:如何找到已更改的列并将此列号传递给服务器。
保存方法应为已知列(名称或条形码变更单)并填写不同的列。这看起来不合理
可能性3
使用模糊:
colModel: [{"label":"ProductCode","name":"ProductCode","editoptions":{
"dataEvents":[
{"type":"focus","fn":function(e) { ischanged=false}},
{"type":"change","fn":function(e) {ischanged=true}},
{"type":"keydown","fn":function(e) {ischanged=true }},
{"type":"blur","fn":function(e) { if(ischanged) validate(e)} }
]},
为了实现验证,我发现Oleg中的代码在
所需经费概要:
若更改了列中的列,并在更改的列中按了“移出焦点”或“回车”以保存,则服务器端同步,若不可能,则应调用异步方法。更改的列名和编辑方法中的当前编辑行值作为参数传递给此方法
此方法返回已编辑行的新值。当前编辑的行值应替换为该方法返回的值
更新2
这个问题与并发无关。这是单用户和jqGrid的问题。更新意味着单个用户更改产品名称或条形码,服务器应提供附加数据(产品id和/或名称/条形码)作为响应
更新4
我尝试了下面的代码。
若用户输入新代码并按Enter键而不移动到其他行,则不会发生模糊,也不会调用验证
如果单元格脏了,如何在jqGrid保存方法中删除?或者,如果按enter键结束编辑,如何强制运行此代码,而不丢失更改的外键单元格的焦点
function validate(elem, column) {
ischanged = false;
var i, form, row;
var postData = { _column: column };
var colModel = $("#grid").jqGrid('getGridParam', 'colModel');
var formEdit = $(elem).is('.FormElement');
// todo: use jQuery serialize() ???
if (formEdit) {
form = $(elem).closest('form.FormGrid');
postData._rowid = $("#grid").jqGrid('getGridParam', 'selrow');
for (i = 0; i < colModel.length; i++)
eval('postData.' + colModel[i].name + '="' + $('#' + colModel[i].name + '.FormElement', form[0]).val() + '";');
}
else {
row = $(elem).closest('tr.jqgrow');
postData._rowid = row.attr('id');
for (i = 1; i < colModel.length; i++)
eval('postData.' + colModel[i].name + '="' + $('#' + postData._rowid + '_' + colModel[i].name).val() + '";');
}
$.ajax('Grid/Validate', {
data: postData,
async: false,
type: 'POST',
success: function (data, textStatus, jqXHR) {
for (i = 0; i < data.length; i++) {
if (formEdit)
$('#' + data[i].name + '.FormElement', form[0]).val(data[i].value);
else
$('#' + postData._rowid + '_' + data[i].name).val(data[i].value);
}
}
});
}
这是一个从问题,这是更容易避免和消除。我必须提醒您我的建议(在对的评论中)使用不可变的主键,因此,主键永远不会更改。可以销毁数据库表的记录,但新记录的id不应为已删除记录 在任何并发控制实现中,服务器首先能够检测到并发问题是很重要的。您的web应用程序的两个(或多个)用户可能会读取相同的信息,例如有关员工的信息。例如,这些信息可以在jqGrids中显示。如果允许更改员工id,则第一个问题是检测并发错误。让我们看看,一个用户将更改员工id,另一个用户将尝试根据以前加载的信息修改同一员工。用户提交MIDID后,服务器应用程序将只接收“编辑”请求,但将在数据库中找不到相应的记录。服务器必须发送错误响应,但不提供任何详细信息。因此的
errorfunc
或的事件处理程序errorTextFormat
应触发“reloadGrid”,重新加载整个网格
如果您允许编辑主键,那么我可以想象前面描述的更危险的情况。另一个用户不仅可以将当前编辑行的id更改为另一个值,还可以更改另一条记录的id,使其新id与当前编辑id相同。在这种情况下,保存行的请求将覆盖另一条记录
ALTER TABLE dbo.Employees ADD NewId int IDENTITY NOT NULL
ALTER TABLE dbo.Employees ADD RowUpdateTimeStamp rowversion NOT NULL
ALTER TABLE dbo.Employees ADD CONSTRAINT UC_Employees_NewId UNIQUE NONCLUSTERED (NewId)
GO