我们正在使用jqGrid在我们的网站上显示交互式列表。我们有一个用于此列表的ajax数据调用的访问层文件 - 它以特定格式接收参数并返回JSON结果。此访问层需要url参数functionName和functionParams(json参数集合)。
我们在网格中提供内联编辑和删除功能,但问题是您只能为两者设置一个网址。
所以,我们需要编辑网址看起来像这样:
for (i=0;i<data['data'].length;i++) {
series.push(data['data'][i]);
}
删除网址如下所示:
editurl: 'ListAjaxAccess.cfm?functionName=editMember&functionParams={"id":"341","firstName":"John","lastName":"Smith"}'
但是,您只能使用editurl为内联编辑和内联删除设置一个URL,后者会将表单与“oper”参数一起发布到页面以进行区分。在定义editurl时,我似乎无法找到访问oper param或表单值的方法,以便我可以动态构建url。
我能看到的唯一方法是创建另一个文件inlineListProcessing.cfm,将editurl设置为该文件,该文件将构造正确的格式并调用ListAjaxAccess。我宁愿不创建额外的中间文件 - 还有其他选择吗?有没有办法调用不同的URL或根据操作动态构建url字符串?
答案 0 :(得分:0)
您需要使用HTTP POST,但将参数放在URL中有点奇怪。 URL中的参数通常仅用于HTTP GET请求,但HTTP GET通常会被缓存(HTTP标头不禁止)。一切皆有可能。
我将从删除开始。重要的是要了解formatter:'actions'
在内部使用表单编辑delGridRow
,其中描述了哪些选项和回调here。选项url
指定Ajax请求中使用的URL,mtype
选项可用于指定HTTP方法。默认值为mtype: "POST"
。要制作动态网址,您可以使用onclickSubmit
回调,其中第一个参数(options
)引用到{{1}的内部选项}}。您可以修改delGridRow
的{{1}}属性,然后jqGrid将在Ajax请求中使用已修改的URL,该URL将发送到服务器。重要的是要理解url
的主要目标是使用附加信息扩展postdata。如果不需要发送其他数据,则应返回空对象options
。 onclickSubmit
的第二个参数是id或以逗号分隔的id列表(如果使用{}
)。我想您不使用onclickSubmit
选项,只需要删除一行。生成的multiselect: true
回调代码如下:
multiselect: true
如果你使用免费的jqGrid,那么你可以很容易地设置回调。见the article。您可以在属性中包含jqGrid选项onclickSubmit
:
onclickSubmit: function (options, rowid) {
options.url = "ListAjaxAccess.cfm?functionName=deleteMember&functionParams=" +
JSON.stringify({id: rowid});
}
现在删除行方法formDeleting
的任何调用都将使用回调(包含formDeleting: {
onclickSubmit: function (options, rowid) {
options.url = "ListAjaxAccess.cfm?functionName=deleteMember&functionParams=" +
JSON.stringify({id: rowid});
}
}
)。
如果您必须使用旧的jqGrid 4.6并使用delGridRow
,那么您应该仔细检查formatter: "actions"
here的选项。代码中的相应更改将位于定义formatter: "actions"
的列内。首先,你应该从不使用 formatter: "actions"
。每列的formatter: "actions"
应与HTML中的name: ''
规则相对应,且值必须唯一。你可以使用像
name
现在回到第二个问题:设置内联编辑的动态网址。这可能相对棘手,因为我在URL中写入参数放置对于HTTP POST来说绝对不典型。可以使用id
回调动态修改URL,但回调的选项不具有修改结果。因此,您应该确认您确实需要将数据作为URL的参数,并将相同的数据放在HTTP POST的正文中,不适合您。
更新:如果您需要使用HTTP GET进行内联编辑,那么您应首先添加代码
{
formatter: "actions",
formatoptions: {
delOptions: {
onclickSubmit: function (options, rowid) {
options.url = "ListAjaxAccess.cfm?functionName=deleteMember&functionParams=" +
JSON.stringify({id: rowid});
}
}
}
}
代码开头的某个地方。它将用于内联编辑的默认HTTP方法从“POST”更改为“GET”。这是必需的,因为旧的jqGrid 4.6版本的beforeSaveRow
无法指定内联编辑的$.jgrid = $.jgrid || {};
$.jgrid.inlineEdit = $extend(true, $.jgrid.inlineEdit, {mtype: "GET"});
选项。在免费的jqGrid中,可以在formatter: "actions"
的{{1}}属性内使用mtype
,或者在jqGrid:mtype: "GET"
的{{1}}选项内使用formatoptions
。
要自定义内联编辑参数的格式,可以使用jqGrid的formatter: "actions"
回调(参见here):
inlineEditing
要使用HTTP GET进行删除,您可以将inlineEditing: { mtype: "GET" }
选项添加到上述serializeRowData
。或者,您可以使用其他形式:
editurl: "ListAjaxAccess.cfm",
serializeRowData: function (postData) {
return {
functionName: "editMember",
functionParams: JSON.stringify(postData)
}
}
编辑和删除都将使用mtype: "GET"
,但会使用不同的网址参数。
我必须注意,HTTP GET默认会在Web浏览器中缓存。为了确保不使用缓存,我建议您在URL上的服务器响应中设置delOptions
HTTP标头。