【问题标题】:jqgrid, how to pass data when adding row using add navigator buttonjqgrid,如何在使用添加导航器按钮添加行时传递数据
【发布时间】:2011-12-17 22:22:11
【问题描述】:

如果使用添加导航按钮添加行,如何传递额外的 POST 键来添加控制器?

我尝试使用下面的代码将 _dokdata 与表单值一起传递,但 _dokdata 未传递给控制器 服务器。

$("#grid").jqGrid('inlineNav', '#grid_toppager', {
   addParams: {
    useDefValues : true,
    useFormatter : false,
    addRowParams : {
        extraparam : { _dokdata : FormData },
       editData: { _dokdata: FormData },
       },
    editData: { _dokdata: FormData },
    extraparam : { _dokdata : FormData },
   },

   add: true,
   edit: false,
   save: true,
   cancel: true,
   editParams : {}
   }); 

function FormData() {
    return JSON.stringify($("#_form").serializeArray());
}

【问题讨论】:

  • 我在代码前固定了<!-- language: lang-js -->的位置。现在您看到代码将使用特定于 JavaScript 的颜色进行格式化。如果您要使用额外的 jquery 或 javascript 标签,则无需添加 <!-- language: lang-js --> 即可获得良好的格式化(带颜色)代码。

标签: jqgrid


【解决方案1】:

您描述的问题似乎是您的代码中的小错误和 jqGrid 代码中的错误的混合(参见以the place 开头的行)。

您的代码中的问题是您没有像设置addParams 那样正确设置editParams。正确的用法应该是:

$("#grid").jqGrid('inlineNav', '#grid_toppager', {
    addParams: {
        useDefValues: true,
        addRowParams: {
            keys: true,
            extraparam: { _dokdata: FormData }
        }
    },
    editParams: {
        extraparam: { _dokdata: FormData }
    },
    add: true,
    edit: false,
    save: true,
    cancel: true
}); 

function FormData() {
    return JSON.stringify($("#_form").serializeArray());
}

jqGrid当前版本代码中的问题在我看来是jqGrid在 保存按钮(参见here)仅使用editParams.extraparam 的设置,而不使用addParams.addRowParams.extraparam 之类的设置。我在inlineNavaddParams.addRowParams 参数中添加了keys: true 选项。因此,您将看到 jqGrid 的当前实现(v 4.3.0)将使用 addParams.addRowParams.extraparam,如果用户将通过按 Enter 来保存更改,并且在保存的情况下将使用 editParams.extraparam导航器按钮的“保存”按钮所在的行。

更新:我测试了代码并在 jqGrid v. 4.3.0 中发现了另一个错误。我建议在the feature request 中引入$.jgrid.inlineEdit 设置,它可以像其他非常实用的设置$.jgrid.edit 一样使用,但在内联而不是表单编辑的情况下。功能请求已实现 在 jqGrid 4.3.0 中,但实现包含一个错误。

要修复该错误,应将33117304 替换为

o = $.extend($.jgrid.inlineEdit, settings, args[0]);

o = $.extend(true, {}, settings, $.jgrid.inlineEdit, args[0]);

the demo看你怎么看,修复bug后一切正常。

更新 2:上述修复与 the fix 相同,但仍然不正确。要修复错误,必须对代码进行更多更改。例如,32-36 行(editRow 内部)可以更改为

if(args[0] && typeof(args[0]) == "object" && !$.isFunction(args[0])) {
    o = $.extend($.jgrid.inlineEdit, settings, args[0]);
} else {
    o = settings;
}

例如下面的

if(args[0] && typeof(args[0]) == "object" && !$.isFunction(args[0])) {
    settings.keys = false; // keys is args[0] and it's an object
    o = $.extend(true, {}, settings, $.jgrid.inlineEdit, args[0]);
} else {
    o = settings;
}

以同样的方式116-120 行(saveRow 内部)

if(args[0] && typeof(args[0]) == "object" && !$.isFunction(args[0])) {
    o = $.extend($.jgrid.inlineEdit, settings, args[0]);
} else {
    o = settings;
}

可以改成

if(args[0] && typeof(args[0]) == "object" && !$.isFunction(args[0])) {
    settings.successfunc = null; // successfunc is args[0] and it's an object
    o = $.extend(true, {}, settings, $.jgrid.inlineEdit, args[0]);
} else {
    o = settings;
}

还有304一行

o = $.extend($.jgrid.inlineEdit, settings, args[0]);

可以改成

o = $.extend(true, {afterrestorefunc: null}, $.jgrid.inlineEdit, args[0]);

更新 3:我向 trirand 发布了关于“删除”问题的 my suggestion。查看使用修复 here 的相同演示。

【讨论】:

  • 谢谢。我试过但输入键没有结束内联添加。如何按 Enter 保存添加的行?
  • @Andrus:我向托尼发布了the following comment 所描述的问题。
  • @Andrus:你如何阅读here我的建议已经在jqGrid的主要代码中,Tony如何编写它可能会在今天发布新的固定版本。
  • @Andrus:参见“更新 3”部分。
  • @Andrus:你只是在浪费我的时间。我尝试设置jQuery.jgrid.defaults 以及您如何从the demo 看到它没有任何问题。您可以使用 WinDiff.exe 将 jquery.jqGrid.src-delete.jsjquery.jqGrid.src.js 进行比较,并确切地看到我只做了我描述的更改。如果存在任何问题,那不是因为我的更改。此外,我之前写信给你,所有关于“删除”中问题的讨论与你关于我回答的extraparam 的问题毫无共同之处。
猜你喜欢
  • 1970-01-01
  • 2012-09-10
  • 2014-08-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-21
相关资源
最近更新 更多