如何在jqGrid的内联编辑中指定不同的URL或参数进行编辑/删除?

时间:2015-10-23 07:38:52

标签: jquery ajax jqgrid

我们正在使用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字符串?

1 个答案:

答案 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。如果不需要发送其他数据,则应返回空对象optionsonclickSubmit的第二个参数是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标头。