Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jquery jqGrid TreeGrid不向服务器发送附加数据_Jquery_Jqgrid_Treegrid - Fatal编程技术网

Jquery jqGrid TreeGrid不向服务器发送附加数据

Jquery jqGrid TreeGrid不向服务器发送附加数据,jquery,jqgrid,treegrid,Jquery,Jqgrid,Treegrid,我有一个jqGrid树ID,定义如下: $('#MyGrid').jqGrid({ colNames: ['Id','Nome','Nivel','Combo',''], colModel: [ { hidden: true, name: 'Id' }, { editable: true, name: 'Nome' }, { hidden: true, name: 'Nivel' }, { name: 'Combo'

我有一个jqGrid树ID,定义如下:

$('#MyGrid').jqGrid({
    colNames: ['Id','Nome','Nivel','Combo',''],
    colModel: [
        { hidden: true, name: 'Id' },
        { editable: true, name: 'Nome' },
        { hidden: true, name: 'Nivel' },
        { name: 'Combo', editable: true, edittype: 'select',
            editoptions: {
                buildSelect: createSelectList ,
                dataUrl: '/Home/GetCombo' // <-- to this controller, I want
                    // to send the id of the row edited to load custom items
                    // in select object
            }}, 
        { formatter: 'actions', formatoptions: { keys: true },
            resizable: false, search: false, sortable: false,
            width: 60, viewable: false, name: 'actions' }
    ],
    cellEdit: true,
    url: '...',
    datatype: 'json',
    editurl: '...',
    jsonReader: {
        repeatitems: false,
        id: 'Id',
        subgrid: { repeatitems: false }
    }, 
    mtype: 'POST',
    gridComplete: function() { myOnGridComplete(); },
    ajaxSelectOptions: {
        data: {
            tempid: function () {
                // !!! the next line always returns null
                return $('#MyGrid').jqGrid('getGridParam', 'selrow');
            }
        }
    }, 
    prmNames: { npage: 'npage' }, 
    rowNum: -1,
    ExpandColClick: true,
    ExpandColumn: 'Nome',
    treeGrid: true,
    treeGridModel: 'adjacency',
    width: 700,
    height: '100%'
});
步骤3:从
ajaxSelectOptions
中的隐藏字段中获取
rowID

ajaxSelectOptions: "{type: 'GET', contentType: 'application/json; charset=utf-8',dataType: 'json',cache: false, async:false, data: {id: function () { return $('#myHiddenField').val(); }}}"
解决方案


请参见下面Oleg提供的解决方案。太神奇了。谢谢你,奥列格。

我不确定我是否正确理解了你的问题。TreeGrid在加载子节点期间自动发送父节点的id。请参阅关于将发送到服务器的
nodeid
parentid
n_级别
参数。因此,我不明白为什么需要将当前选定行的id(
selrow
)另外发送到服务器

更新:现在我了解了您描述的问题的原因。这真是一个有趣的问题,可能会有其他人

真正的解决方案是更改jqGrid的代码以支持一些回调函数,这些回调函数可以构造
$中使用的
数据
参数。jqGrid原始代码的最简单修改是插入行

var rowid = $.jgrid.stripPref($t.p.idPrefix,
        String(options.id).substring(0, String(options.id).length - String(options.name).length - 1));
在代码行之前,将调用带有
dataUrl
$.ajax
。此外,还需要在
$中再添加一个参数。ajax

data: $.isFunction(ajaxso.postData) ?
    ajaxso.postData.call($t, rowid, String(options.name), vl) :
    ajaxso.postData,
在这些改变之后,一个人将能够使用

ajaxSelectOptions: {
    postData: function (rowid, colName, value) {
        return { id: rowid };
    }
}
证明该方法有效。您可以在Fiddler、Firebug或开发人员工具中看到,
id
选项将真正发送到URL。稍后我会将相应的建议发布到trirand(我想对更常见的情况做一些额外的改进)

如果需要使用当前版本的jqGrid实现解决方案,可以执行以下操作。您可以对执行
$.ajax
请求的方法
$.jgrid.createEl
进行“子类化”。实施也将非常简单:

var originalCreateEl = $.jgrid.createEl,
    createElementOptions;

$.extend($.jgrid, {
    createEl: function (eltype, options, vl, autowidth, ajaxso) {
        if (options.dataUrl) {
            createElementOptions = options;
        }
        return originalCreateEl.call(this,eltype, ptions,vl,autowidth,ajaxso);
    }
});

$('#MyGrid').jqGrid({
    ...
    ajaxSelectOptions: {
        data: {
            id: function () {
                var id = createElementOptions.id,
                    colName = createElementOptions.name;
                if (typeof id !== "string" || typeof colName !== "string") {
                    return null;
                }
                return id.substring(0, id.length - colName.length - 1);
            }
        }
    }
});
示范一下


更新2:我发布了一篇文章,以支持
postData
作为
`和
ajaxSelectOptions`的属性。请求现在已提交(请参阅)。因此,jqGrid的下一个版本(更高版本为4.4.1)将具有“开箱即用”的功能。谢谢你的帮助。我的问题不是把树绑起来。这工作正常。我的问题是当我单击叶节点中的编辑按钮时。在此单击事件中,我想向服务器发送其他数据。例如,有了这些附加信息,我可以为不同行中的每个组合框绑定不同的行信息。@WashingtonMorais:在您的场景中编辑行真的被选中了吗
selrow
等于
null
表示未选择任何行。
格式化程序:“操作”
不会阻止行的选择。可能是您在
myOnGridComplete
中使用的代码以某种方式阻止了在编辑过程中选择行?Hi-Oleg。我找到了解决办法。在myOnGridComplete中,我将单击事件设置为编辑,并将行id设置为隐藏字段。之后,在ajaxSelectOptions中,我将此id传递给服务器。@WashingtonMorais:对不起,我不明白您为什么需要这样做。将
单击
事件处理程序绑定到每一行只需获取不必要的内存资源。您没有回答我的问题:“在您的场景中编辑行真的被选中了吗?”。如果需要通过操作格式化程序跟踪最后一个编辑行,可以使用
onEdit
callback(参见示例)。无论如何,不清楚为什么
selrow
为空。仅当未选择任何行时,它才应为null。我进行了测试,并注意到对参数dataUrl中URL的调用发生在事件onEdit之前。我需要在调用dataURL之前获取rowid。
var originalCreateEl = $.jgrid.createEl,
    createElementOptions;

$.extend($.jgrid, {
    createEl: function (eltype, options, vl, autowidth, ajaxso) {
        if (options.dataUrl) {
            createElementOptions = options;
        }
        return originalCreateEl.call(this,eltype, ptions,vl,autowidth,ajaxso);
    }
});

$('#MyGrid').jqGrid({
    ...
    ajaxSelectOptions: {
        data: {
            id: function () {
                var id = createElementOptions.id,
                    colName = createElementOptions.name;
                if (typeof id !== "string" || typeof colName !== "string") {
                    return null;
                }
                return id.substring(0, id.length - colName.length - 1);
            }
        }
    }
});