【问题标题】:dataUrl (editoptions for select) is not working/populating data into Dropdownlist in JQGRIDdataUrl(用于选择的编辑选项)不工作/将数据填充到 JQGRID 中的下拉列表中
【发布时间】:2016-02-24 16:51:28
【问题描述】:

我正在使用 JQGRID 和代码如下

   $("#jqGridDel").jqGrid({
            url: "Data.aspx/BindInfo",
            datatype: 'json',
            mtype: 'POST',
            serializeGridData: function (postData) {
                return JSON.stringify(postData);
            },
            ajaxGridOptions: { contentType: 'application/json; charset=utf-8' },
            ajaxSelectOptions: { type: 'POST',
                contentType: 'application/json; charset=utf-8',
                success: function (result) {
                    alert("hello");
                }
            },,
            colName: ['DelId', 'Name', 'DeliveryName', 'Status'],
            colModel: [
                {
                    label: 'Del No',
                    name: 'DelId',
                    width: 35
                },
                {
                    label: 'Gate',
                    name: 'Name',
                    width: 200,
                    editable: true,
                    edittype: "select", 
                    foramtter: "Select",
                    editoptions: {
                        dataUrl: "Data.aspx/BindDDInfo",
                        buildSelect: function (data)
                        {
                            alert(data);
                        }
                    }
                },
                {
                    label: 'Delivery',
                    name: 'DeliveryName',
                    width: 150,
                    editable: true
                },
                {
                    label: 'Active',
                    name: 'Status',
                    width: 40,
                    editable: true,
                    align: "center",
                    formatter: "checkbox",
                    edittype: "checkbox",
                    editoptions: { value: '1:0' }
                }
            ],
            loadonce: true,
            width: 1050,
            height: "100%",
            pager: "#jqGridDelPager",
            caption: "Configuration",
            rowNum: 15,
                            jsonReader: {
                                page: function (obj) { return 1; },
                                total: function (obj) { return 1; },
                                records: function (obj) { return obj.d.length; },
                                root: function (obj) { return obj.d; },
                                repeatitems: false,
                                id: "QGDelId"
                            },
            onSelectRow: function (id) {
                if (id && id !== lastSelQGDel) {
                    lastSelQGDel = id;
                }

            },
          ajaxRowOptions: { contentType: 'application/json; charset=utf-8' },
            serializeRowData: function (postData) {
                return JSON.stringify({ editQGData: postData });
            },
            editurl: "Data.aspx/SaveData"
        });

        $('#jqGridDel').navGrid("#jqGridDelPager", { edit: false, add: false, del: false, refresh: false, search: false, view: false });
        $('#jqGridDel').inlineNav('#jqGridDelPager',
        // the buttons to appear on the toolbar of the grid
            {
            edit: true,
            add: true,
            del: true,
            refresh: true,
            cancel: true,
            editParams: {
                keys: true,
                rowid: lastSelQGDel,
                restoreAfterError: true,
                reloadAfterSubmit: true,
                successfunc: function (result) {
                    if (result.responseJSON.d == "Success")
                        alert("Data saved successfully!!");
                    else
                        alert("There is some error in data processing");
                    setTimeout(function () {
                        $("#jqGridDel").jqGrid('setGridParam', { datatype: 'json' }).trigger('reloadGrid');
                    }, 50);
                }
            },
            addParams: {
                keys: true,
                addRowParams: {
                    successfunc: function (result) {
                        if (result.responseJSON.d == "Success")
                            alert("Data saved successfully!!");
                        else
                            alert("There is some error in data processing");
                        setTimeout(function () {
                            $("#jqGridDel").jqGrid('setGridParam', { datatype: 'json' }).trigger('reloadGrid');
                        }, 50);
                    }
                }
            }

使用以下参考文件..

 <script src=”Scripts/jquery-1.11.0.min.js” type=”text/javascript”></script>
 <script src=”Scripts/grid.locale-en.js” type=”text/javascript”></script>
 <script src=”Scripts/jquery.jqGrid.min.js” type=”text/javascript”></script>
 <script src=”Scripts/jquery-ui.min.js” type=”text/javascript”></script>

我能够加载数据并将其从 JQGRID 保存到 SQL 数据库,反之亦然。 但是,选择选项(列:门)没有加载任何数据。我尝试调试代码并了解到在通过 inline-nav 编辑行期间 dataUrl 没有触发。

函数 BindDDInfo 背后的代码(返回类型为 'string' 并提到 Webmethod 和静态)以 &lt;Select&gt; &lt;Option&gt;……&lt;/Option&gt; &lt;/Select&gt; 格式返回字符串。

<select>
<option value='1'>Text1</option>
<option value='2'>Test2</option>
<option value='3'>Test3</option>
<option value='4'>TEst5</option>
<option value='5'>TEst6</option>
<option value='6'>Test7</option> 
<option value='7'>Test8</option>
<option value='8'>Test9</option>
</select>

通过 F12 检查(在 IE9 中),可以看到如下响应标头

Response         HTTP/1.1 200 OK
Server           ASP.NET Development Server/10.0.0.0
Date             Wed, 24 Feb 2016 15:07:16 GMT
X-AspNet-Version 4.0.30319
Cache-Control    no-cache, no-store
Pragma           no-cache
Expires          -1
Content-Type     text/html; charset=utf-8
Content-Length   69186
Connection       Close

响应正文返回 data.aspx html 页面,不知道出了什么问题。

然后,我在 web.config 文件中添加了 HTTP 处理程序

        <add name="ScriptModule" type="System.Web.Handlers.ScriptModule, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>

现在,dataUrl 正在点击 webmethod BindDdInfo 并弹出警报(“hello”)(来自 ajaxSelectOptions),但它不会在 editoptions 中构建选择。

以下内容作为响应体返回 {"d":"\u003cselect\u003e\u003c选项值=\u00271\u0027\u003eTest1\u003c/option\u003e\u003c/select\u003e"}


在建议从 BindDDInfo 获取 JSOn 数据后,我修改了如下代码,

我已更改我的 web 方法以返回 List&lt;Dictionary&lt;string, object&gt;&gt; 和以下代码

ajaxSelectOptions: { type: ‘POST’,
contentType: ‘application/json; charset=utf-8’,
datatype: ‘json’,
success: function (result) {
alert(JSON.stringify(result));
}
}

警报显示如下

  {“d”:[{“ID”:1,”Name”:”Test1″},{“ID”:2,”Name”:”Test2″}]}

但是,buildSelect 没有被击中,

 dataUrl: “Data.aspx/BindDDInfo”,
 buildSelect: function (response) {
 var data = typeof response === “string” ? JSON.stringify(response) :      response,
 s = “<select>”;
 s += ‘<option value=”0″>–Select–</option>’;
 $.each(data, function () {
 s += ‘<option value=”‘ + this.ID + ‘”>’ + this.Name + ‘</option>’;
 });
 return s + “</select>”;
 }

在 buildSelect 中尝试了 console.log(response) 和 alert(response),但没有弹出任何窗口。

谁能帮我从数据库中将数据放入 JQGRID 的下拉列表中。

【问题讨论】:

    标签: jquery jqgrid asp.net-ajax free-jqgrid


    【解决方案1】:

    您的主要问题是“dataUrl 在通过 inlineNav 编辑行期间未触发”。我在代码中看到了许多可以改进的小东西。我想主要问题是列Name(门列)中的输入错误。你应该使用

    formatter: "select"
    

    而不是

    foramtter: "Select"
    

    (两个错误:应该使用formatter 而不是foramtter"select" 而不是"Select")。

    另外我会向你推荐一些其他的小技巧:

    • 从页面的 HTML 标记中删除 &lt;div id="jqGridDelPager"&gt;&lt;/div&gt; 并使用 pager: true 而不是 pager: "#jqGridDelPager"。您可以跳过 navGridinlineNav"#jqGridDelPager" 参数。免费的 jqGrid 自动为寻呼机创建了 div,navGridinlineNav 将使用寻呼机。
    • 您在所有列中使用label 属性,并为colName 使用另一个文本。该选项的正确名称是colNames 而不是colName。您可以将文本从 label 移动到 colNames 数组或删除不需要的 colName 数组。
    • inlineNav free jqGrid 的方法自动创建导航栏它不存在。因此,您可以删除不需要的 navGrid 调用。
    • 您不需要使用ajaxSelectOptions: { cache: false, type: 'POST' }。您可以改用ajaxSelectOptions: { type: 'POST' }
    • 您可以使用singleSelectClickMode: "selectonly",如果您希望第二次单击该行而不是取消选择它
    • 您可以使用forceClientSorting: true 选项强制对从服务器返回的数据按客户端大小进行排序。您只需添加例如 sortname: "Name" 选项,它会通知 jqGrid 数据应按哪一列排序。
    • jsonReader 的值可以缩减为jsonReader: {root: "d", repeatitems: false, id: "QGDelId"}。重要的是,设置id: "QGDelId" 意味着每个数据项都包含具有唯一值的QGDelId 属性,该属性应用作rowid。
    • 我不明白您使用的onSelectRow 的含义以及lastSelQGDel 变量的目标。我建议你删除回帖。
    • 免费的 jqGrid 提供了更舒适的方式来指定底层方法的选项。例如,jqGrid 的inlineEditing 选项允许指定内联编辑方法使用的 common 选项。您更正了代码,例如,在addParams.addRowParamseditParams 中指定相同 选项(参见inlineNav 的选项)。顺便说一句,key: trueaddParams 内部的位置而不是addParams.addRowParams 是错误的。最好在 jqGrid 的 inlineEditing 选项中指定常用选项。请参阅the wiki article 了解更多信息。
    • 我推荐你使用
    $("#jqGridDel").trigger('reloadGrid', [{fromServer: true}]);
    

    而不是

    $("#jqGridDel").jqGrid('setGridParam', { datatype: 'json' }).trigger('reloadGrid');
    

    【讨论】:

    • 您好奥列格,感谢您的快速回复。我已更新为 formatter:"select" 和 ajaxSelectOptions: { type: 'POST' } 但在编辑期间仍然没有在下拉列表中填充数据。我已经在代码隐藏中的 BindDDInfo 中放置了调试点,它没有被 dataUrl 命中,但是当我在 url 中提到相同的 BindDDInfo 时,调试点被命中(将数据选择到 jqgrid)。
    • @NM1988:需要调试代码。您能否提供使用非最小化免费 jqGrid 文件jquery.jqgrid.src.js 并重现问题的演示?您可以在the linethe line 上设置断点以查看问题原因。
    • 奥列格,当然……会尽快分享。
    • 嗨,奥列格,我发现了一些有趣的东西......我为 dataUrl 提供了 'Data.aspx/Bind',其中代码隐藏中没有 webmethod 'Bind' 但仍然 ResponseHeader 声明 HTTP/1.1 200 和了解 Responsebody 填充了 Data.aspx(甚至使用 BindDDInfo)。那么,Jqgrid 版本有什么问题吗?
    • @NM1988:对不起,我不能关注你。首先验证 jqGrid 是否向dataUrl: "Data.aspx/BindDDInfo" 发送 HTTP 请求很重要。您可以在Fiddler 或 IE/Chrome/Firefox 的开发者工具中查看完整的 HTTP 流量。然后您应该验证来自dataUrl: "Data.aspx/BindDDInfo" 的响应是否正确。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-24
    • 1970-01-01
    • 2014-05-24
    • 2020-06-28
    • 1970-01-01
    相关资源
    最近更新 更多