【问题标题】:Simple jqgrid Delete in MVCMVC中的简单jqgrid删除
【发布时间】:2012-05-14 22:14:33
【问题描述】:

我一直在网上寻找答案,也许它比我预期的更复杂(或者我只是不明白解决方案),但我正在寻找一种方法来简单地删除通过单击垃圾桶图标从我的 jqgrid 中选择行。

目前我的网格正在填充 Linq to SQL 数据。 这是我的网格:

jQuery("#grid").jqGrid({
                     url: '<%= ResolveUrl("~/Home/GetData") %>',
                     datatype: "json",
                     mtype: 'GET',
                     postData: { DDLid: function () { return jQuery("#DDL option:selected").val(); } },
                     colNames: ['Col1', 'Col2'],
                     colModel: [
                        { name: 'Col1', index: 'Col1', width: 200, editable: false },
                        { name: 'Col2', index: 'Col2', width: 200, editable: false }
                        ],
                     jsonReader: {
                         repeatitems: false
                     },
                     rowNum: 10,
                     pager: jQuery('#gridpager'),
                     sortname: 'Type',
                     viewrecords: true,
                     sortorder: "asc",
                     caption: "Table"
                 }).navGrid('#gridpager', { del: true, add: false, edit: false, search: false }, {}, {}, {url: "Delete"});

现在帖子数据中的“id”不是此表中的主键 - 我只需要它来帮助填充网格。 我想得到的是选定的行 id 并将其传递给 Delete 方法,但我找不到任何方法。

我曾尝试在 postData 中使用jQuery("#grid").getGridParam('selrow'),但它总是返回 null。

任何帮助将不胜感激。

这是我的删除方法,供参考:

[AcceptVerbs(HttpVerbs.Post)]
    public ActionResult Delete(int DDLid) 
    {
        int row = Convert.ToInt32(/*I NEED THIS ID*/);
        var query = from x in _ctx.DataTable
                    where ((x.id == row))
                    select x;
        _ctx.DataTable.DeleteOnSubmit(query.Single());
        _ctx.SubmitChanges();
        return Json(true);
    }

这个方法被调用并且很好,但是我得到了错误的 id。我需要所选行的 ID。这会中断,因为 DDLid 返回不止一行(因为它用于填充网格)。

我希望这是有道理的。

【问题讨论】:

  • mtype 不应该是 POST/DELETE 而不是 GET 吗?
  • 我有这样的 navGrid,并且出现了同样的结果:.navGrid('#gridpager', { del: true, add: false, edit: false, search: false }, {}, {}, { url: "Delete", mtype: "POST", reloadAfterSubmit: true });

标签: asp.net-mvc jqgrid


【解决方案1】:

我发现我会在哪里传递选定的索引(但后来我意识到我正在寻找主键,而不是选定的索引,但无论如何它都是相同的结果)

我需要将此添加到我的导航网格中:

 {url: "Delete", mtype: "POST", reloadAfterSubmit: true, 
       serializeDelData: function (postdata) {
                         var selectedrowindex = jQuery("#grid").jqGrid('getGridParam', 'selrow');
                         var dataFromCellByColumnIndex = jQuery('#grid').jqGrid ('getCell', selectedrowindex , 1); 
                         return {DDLid: postdata.id, name: dataFromCellByColumnIndex};
       }
 });

因此,这会将列值传递给我的删除方法以及 DDLid,但我可以轻松地将 dataFromCellByColumnIndex 与 selectedrowindex 交换。

【讨论】:

  • 我之前写过你问题的根源在于错误填充网格中数据的ID。如果您将问题附加到将从url: '&lt;%= ResolveUrl("~/Home/GetData") %&gt;' 返回的数据(有一行数据就足够了),我会告诉您错误。服务器返回的数据应该包含id。我想你不这样做。如果'Col2' 列包含id(主键),您可以解决将key: true 添加到列的问题。在这种情况下,selectedrowindex 将与 dataFromCellByColumnIndex 相同。
  • 是的,再看一遍后,我意识到我是个菜鸟,没有传入主键。但我不知道key:true 部分,所以谢谢!有没有关于 jqgrid 的好教程涵盖这样的内容?因为我一直找不到它们……
【解决方案2】:

您应该只实现具有id 参数的Delete 操作:

public JsonResult Delete(string id) {
    ...
}

要引用 JavaScript 代码中的操作,我将使用 'url: &lt;%= Url.Action("Delete") %&gt;' 而不是您当前使用的 url: "Delete"

您可以下载我为the answer 创建的here 演示项目。该项目实现了行的删除以及您当前不需要的许多其他功能。

【讨论】:

  • 我代码中的 id 参数不是我需要删除行的参数(它是下拉列表的 id)。我已经实现了这样的删除操作,并且效果很好(因为我之前使用过一个有效的操作) - 我唯一的问题是我无法传入所选行的主键。
  • 我已经编辑了我的答案以包括删除方法,如果这有帮助:)
  • @vegetas_angel:您应该使用id 作为Delete 操作中的名称。 为形参选择哪个名称很重要id 将被初始化为您需要的值:行 id。该值将被初始化为值$("#grid").jqGrid('getGridParam', 'selrow')。如果id 的值不是您想要的,那么仅意味着您以错误的方式填充网格:从'&lt;%= ResolveUrl("~/Home/GetData") %&gt;' 返回的JSON 数据没有id 或错误的地方。
  • 啊,好的。那么 Delete 方法中的id 可以与 postdata 不同吗?惊人的!谢谢!!下次我会这样做:)
  • @vegetas_angel:"id" 只是参数的默认名称。如果你想有另一个名字,你可以使用 jqGrid 的prmNames 参数。例如prmNames: {id: "DDLid", oper: null} 将在名称DDLid 下发送行ID,并且不会发送oper 参数。
【解决方案3】:

您可以使用自己的参数在 delete 方法中创建另一个帖子。定义网格后,您可以详细定义每个动作。它正在使用正确的 ID 发布实际删除,而原始的正在发布虚假 ID。 JQgrid 使用行计数来删除而不是主键。他们可能会使用最新版本对其进行更改,但这在 Jqgrid 3.8 中有效

 jQuery("#ClientGrid").jqGrid('navGrid', '#ClientGridPager',
{ view: true, edit: true, search: false }, //options
{height: 240, caption: 'Edit Client', beforeShowForm: hideIDColumn, reloadAfterSubmit: true, mtype: 'POST', url: "/Settings/EditClient", jqModal: false, closeOnEscape: true, bottominfo: "Fields marked with (*) are required" }, // edit options
{height: 340, caption: 'Add Client', beforeShowForm: hideIDColumn, reloadAfterSubmit: true, mtype: 'POST', url: "/Settings/CreateClient", jqModal: false, closeOnEscape: true, bottominfo: "Fields marked with (*) are required", closeAfterAdd: true }, // add options
//delete method
{reloadAfterSubmit: true, beforeSubmit: function (postdata, formid)
{
    var lastselectedID = -1;
    if (ClientGridrow != null || typeof (ClientGridrow) != "undefined")
    {
        lastselectedID = $("#ClientGrid").getCell(ClientGridrow, 'ID_PK');
    }
    //CUSTOME delete to send taskid instead of rowid
    $.ajax({ type: "POST", url: "/Settings/DeleteClient/?objid=" + lastselectedID,
        data: "", success: function (response)
        {
            $("#ClientGrid").trigger("reloadGrid"); //reloadAfterSubmit: true is not working in Chrome
        }
    });
    return [true, "Delete failed message"];

}, caption: 'Delete Client', datatype: 'local', url: "/Settings/DeleteClient/?objid=-1", jqModal: false, closeOnEscape: true
}, // del options..we make two posts
  {closeOnEscape: true }, // search options
  {height: 230, width: 350, jqModal: false, closeOnEscape: true} // view options
   );

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-12
    • 2010-12-17
    • 1970-01-01
    • 2011-07-24
    • 2011-04-24
    • 2012-01-14
    • 2015-05-15
    相关资源
    最近更新 更多