【问题标题】:How to make an Ajax call when doing an inline edit进行内联编辑时如何进行 Ajax 调用
【发布时间】:2017-09-26 14:37:03
【问题描述】:

我正在使用免费的 jqgrid 来编辑描述列表。这可以按我的意愿工作,但我找不到如何通过对服务器的 Ajax 调用来持久化这些更改。

<div id="divLoading" class="has-error">Loading ...</div>
<table id="grid"></table>
<div id="pager"></div>

$(function () {
    var data = GetHiddenField("sir-standard-faults-for-category");
    populateGrid(data.FaultCategoryDetails);
});

var populateGrid = function (data) {
    var grid = $("#grid");
    var lastSel = 0;
    grid.jqGrid({
        data: data,
        colNames: ["FaultCategoryDetailId", "Fault"],
        colModel: [
            { name: "FaultCategoryDetailId", index: "FaultCategoryDetailId", width: 65, align: "center", hidden: true, key: true },
            { name: "Description", label: "Description", width: 500, align: "center", editable: true }
        ],
        cmTemplate: { autoResizable: true, align: "center" },
        rowNum: 20,
        pager: "#pager",
        shrinkToFit: true,
        rownumbers: true,
        sortname: "Description",
        viewrecords: true,
        onSelectRow: function (FaultCategoryDetailId) {
            if (FaultCategoryDetailId && FaultCategoryDetailId !== lastSel) {
                jQuery("#grid").restoreRow(lastSel);
                lastSel = FaultCategoryDetailId;
            }
            jQuery("#grid").editRow(FaultCategoryDetailId, true);
        },
        oneditfunc: function() { alert("put ajax call here?"); }
    });

    grid.jqGrid("filterToolbar", {
        beforeSearch: function () {
            return false; // allow filtering
        }
    }).jqGrid("gridResize");
    $("#divLoading").hide();
}

编辑 2: 这是对上一次编辑的更正,尽管这个也不起作用;我把 oneditfunc: function() { alert("editsave"); } 在代码中,目的是在编辑行后捕获“输入”事件。我不知道这是否在 jqGrid 的免费版本中,因为它不起作用。或者更可能是错误的。

【问题讨论】:

  • 对不起,我不明白你的问题。 1)您在页面上显示“#divLoading”。为什么你需要它?至少它最初应该有style="display: none;"。 2) 您的代码不包含任何 Ajax 请求。你想坚持什么? 3) 您仅在本地编辑数据。是要将修改后的行保存到服务器还是计划稍后获取修改后的网格数据并将新数据发送回服务器?
  • 1/ “#divLoading”用于显示“正在加载”,直到网格中的数据被渲染。真的与这个问题无关。 2/ 我不知道将 Ajax 请求放在哪里,这就是它不存在的原因, 3/ 是的,除了在本地保存数据之外,我还想对服务器进行 AJAX 调用以同时保留更改数据保存在本地。我希望这可以澄清?
  • 我想编辑并保留 Description 字段,这意味着我还需要在 AJAX 调用中发送 FaultCategoryDe​​tailId。
  • 所以我想要的是,当我编辑一个单元格并按回车键保存更改时,我想触发一个事件,该事件将使 ajax 调用保持更改。

标签: jquery ajax jqgrid free-jqgrid


【解决方案1】:

jqGrid 已经内置了关于 Ajax 请求将数据保存在服务器上的可能性。您只需将editurl 选项添加到网格。您不需要使用 id 创建隐藏列。取而代之的是,您可以通知 jqGrid 保存信息的属性名称。您可以从 colModel 中删除 FaultCategoryDetailId 列并添加以下选项:

prmNames: { id: "FaultCategoryDetailId" },
localReader: { id: "FaultCategoryDetailId" },

https://jsfiddle.net/OlegKi/neg0e0o2/ 为例。您可以在开发者工具中看到,按下 Enter jqGrid POST 到 editurl 类似的数据

Description=Modified text
oper=edit
FaultCategoryDetailId=20

【讨论】:

  • 太好了,我真的很喜欢不必在我的网格中放置隐藏列。我确定这是答案,但我希望能够编辑editUrl,因为我想调用一个webapi(如果你不能回答这个问题,请道歉)它将url的结尾部分定义为[HttpPost("{ faultCategoryDe​​tailId}/{description}/updatestandardfault")] 所以设置参数可能不会像上面那样格式化。
  • @arame3333:您可以使用附加选项扩展inlineEditing,这些选项定义 HTTP 方法并动态设置 URL。以the answer 为例。您需要发送哪些信息以及具体采用哪种格式?
  • @arame3333:您在实现您的要求方面取得了进展吗?我不确定您想要确切的 URL,但我认为您需要在 inlineEditing 选项中包含属性 url: function (rowid, editOrAdd, postData, options) { return "/" + encodeURIComponent(postData.FaultCategoryDetailId) + "/" + encodeURIComponent(postData.Description) + "/updatestandardfault"; } .ile in jsfiddle.net/OlegKi/neg0e0o2/1
  • @arame3333:不客气!我看到问题现在已经解决了。
  • 最好不要在处于编辑模式的单元格上使用getCell。您可以通过url 函数的下一个参数访问修改后的数据:postData 参数。请参阅我之前的评论。
猜你喜欢
  • 2023-03-31
  • 1970-01-01
  • 1970-01-01
  • 2020-07-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多