【问题标题】:jqGrid setting multiselect checkbox id and name to a different valuejqGrid将多选复选框ID和名称设置为不同的值
【发布时间】:2016-09-23 10:14:50
【问题描述】:

我刚刚在我的 ASP.NET MVC Web 应用程序中添加了免费的 jqGrid。虽然它在大多数情况下都很好用,但我想将多选复选框上的“id”和“name”属性的值设置为表中不同列的 Id 列值?

相反,复选框设置如下:

<input type="checkbox" id="jqg_list2_jqg30" class="cbox" name="jqg_list2_jqg30" aria-checked="false">

如何更换 jqg_list2_jqg30?

我一直在关注这个演示,其中复选框上的 id 和 name 属性设置正确,但我看不出我在做什么不同 - http://www.trirand.com/blog/jqgrid/jqgrid.html

这是jqGrid的逻辑

$("#list2").jqGrid({
        url: 'https://localhost:44319/Package/GetPackages/2',
        datatype: "json",
        contentType: "application/json; charset-utf-8",
        mtype: 'GET',
        colNames: ['Id', 'Name', 'Description'],
        colModel: [
            { name: 'Id', index: 'Id', width: 55, sorttype: "int" },
            { name: 'Name', index: 'Name', width: 90, searchoptions: { "sopt": ["bw", "eq"] } },
            { name: 'Description', index: 'Description', width: 90 }                
        ],
        rowNum: 25,
        rowList: [25, 50],
        pager: '#pager2',
        toppager: true,
        sortname: 'Id',
        viewrecords: true,
        height: "auto",
        sortorder: "asc",
        multiPageSelection: true,
        multiselect: true,
        selarrrow: [],
        caption: "JSON Example",
        loadonce: true,
        jsonReader: { repeatitems: false }
    });
    jQuery("#list2").jqGrid('navGrid', '#pager2',
        { edit: false, add: false, del: false, search: true, view: false, refresh: true });
    jQuery("#m1").click(function () {
        var s;
        s = jQuery("#list2").jqGrid('getGridParam', 'selarrrow');
        alert(s);
    });

我知道我可以编写一些自定义逻辑来执行此操作,但我不认为这是必需的,如上面的示例所示,并且应该开箱即用?

提前致谢。

【问题讨论】:

  • 你到底需要什么?
  • 嗨,我想将多选创建的复选框上的 id 和 name 属性设置为 Id 列中的 Id 值。谢谢
  • contentType: "application/json; charset-utf-8" 选项将在您当前的代码中被忽略,因为contentType 是 jqGrid 的未知选项。如果您需要指定jQuery.ajax 的选项,它在内部使用jqGrid,那么您应该使用选项ajaxGridOptions: { contentType: "application/json; charset-utf-8" } 来代替。如果您真的使用“免费 jqGrid”fork,请另外始终包含 free jqGrid 的 jqGrid 版本,并在问题中添加 free-jqgrid 标签。

标签: javascript jquery asp.net free-jqgrid


【解决方案1】:

我认为您的问题存在一些常见的误解。我假设您通过使用jQuery("#list2").jqGrid('getGridParam', 'selarrrow') 获取所选元素的 id,然后您需要获取有关所选项目的详细信息:“id”和“name”。

第一个问题是网格的 rowid。您没有包含从url: 'https://localhost:44319/Package/GetPackages/2' 返回的任何测试数据,但我可以猜测它是像{"Id": 123, "Name": "Some name", "Description": "Some description"} 这样的项目数组,其中Id 的值来自数据库,并且所有值都是唯一的强>。 jqGrid 的内部组织要求网格的每一行(带有主数据的 HTML 表的每个&lt;tr&gt; 元素)都具有具有唯一值的id 属性。将id 属性的值命名为“rowid”。默认情况下,jqGrid 检查id 属性的输入数据并将这些值用作rowid。如果您使用Id 而不是id,那么您可以添加jsonReader: { id: "Id" } 来解决问题并通知jqGrid 将其用作rowids 的输入。或者,您可以配置 ASP.NET MVC 应用程序的 Newtonsoft.Json 设置以分配 ContractResolver = new CamelCasePropertyNamesContractResolver();。代码中赋值的确切位置取决于您使用的 ASP.NET MVC 的版本。 The answer 显示您可以在 ASP.NET Core 中分配配置设置的位置。我个人使用此类设置是因为我尝试遵循 C# 和 JavaScript 的标准名称转换。

您还有一个选择是将key: true 添加到Id 列。它的作用与jsonReader: { id: "Id" } 几乎相同。

如果您有 rowid(或 jQuery("#list2").jqGrid('getGridParam', 'selarrrow') 的 rowid 数组),那么您可以轻松地从任何列中获取值或相应数据项的任何属性的值。如果您使用loadonce: true,那么从服务器返回的数据项将保存在data 参数中本地,就像使用datatype: "local" 的情况一样。您可以使用getLocalRow 方法轻松获取数据项。您可以更改代码

jQuery("#m1").click(function () {
    var s;
    s = jQuery("#list2").jqGrid('getGridParam', 'selarrrow');
    alert(s);
});

jQuery("#m1").click(function () {
    var $grid = jQuery("#list2"), i, item,
        ids = $grid.jqGrid("getGridParam", "selarrrow");

    for (i = 0; i < ids.length; i++) {
        item = $grid.jqGrid("getLocalRow", ids[i]);
        alert("rowid=" + ids[i] +
            "\nId=" + item.Id +
            "\nName=" + item.Name +
            "\nDescription=" + item.Description);
    }
});

顺便说一下,我建议你从所有列(来自colModel)中删除不需要的index属性,并删除jqGrid的一些默认值选项(mtype: 'GET'height: "auto"sortorder: "asc",@987654350 @)。我建议您从 HTML 页面中删除空 div &lt;div id="pager2"&gt;&lt;/div&gt; 并使用 pager: true 而不是 pager: '#pager2'。免费的 jqGrid 将以与 toppager 相同的方式为页面生成 div(请参阅toppager: true)。它简化了代码。您可以使用jQuery("#list2").jqGrid('getGridParam', 'pager') 获取生成的寻呼机的 id 选择器(如果需要),但大多数情况下不需要它。而不是使用

jQuery("#list2").jqGrid('navGrid', '#pager2', {...});

你可以只用

jQuery("#list2").jqGrid('navGrid', {...});

这会将导航按钮添加到网格的所有页面

【讨论】:

  • 完美,这正是我想要的。在 ID colModel 上设置 key: true 给了我想要的行为。我已按照您的建议完成并整理了属性。非常感谢。
  • @jgill09:不客气!选项jsonReader: { id: "Id" } 可以与key: true 结合使用。如果您在网格中添加编辑,您将看到优势。通过编辑jqGrid会默认发送id属性,但是jsonReader: { id: "Id" }之后会使用修改后的名称Id
猜你喜欢
  • 2014-03-29
  • 2017-02-04
  • 1970-01-01
  • 2015-07-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-07
相关资源
最近更新 更多