0

大家好,我正在创建一个带有可编辑 jqGrid(v4.4)的 Web 应用程序,默认情况下,当您处于编辑模式(内联编辑)并按下 Enter 键时,它会调用 jqGrid 的 saveRow 方法,该方法实际上试图保存行。

问题是我一直在使用自定义方式来保存我的行,并且我只在我先做一些其他事情之后才使用 saveRow。

我为 Enter 创建了一个键绑定,如下所示:

$(document).keyup(function (e) {
                if (e.keyCode == 13) {
                    if (lastsel) {
                        jQuery('#list').jqGrid('saveRow', lastsel, false, 'clientArray');
                        var rowData = jQuery('#list').jqGrid('getRowData', lastsel);
                        // alert(rowData);
                       // alert(JSON.stringify(rowData));
                        jQuery.post('Home/Save?inputEmployee=', JSON.stringify(rowData));
                        lastsel = false;
                    }
                }
              });

问题是它既完成了 jqGrid 为绑定定义的操作,也完成了我在上面所做的操作。

在我使用之前,有什么办法可以摆脱之前对 Enter 的绑定?

编辑:我引入了我的 HomeController Save 方法:

public void Save(string inputEmployee)
{
    Employee employeeData = JsonConvert.DeserializeObject(inputEmployee.ToString(), typeof(Employee)) as Employee;
    var context = new EmployeeDataContext();
    Employee employee = context.Employees.Single(e => e.ID == employeeData.ID);
    employee = employeeData;
    context.SubmitChanges();
}

所以我所做的是我创建了一个 LINQ to SQL 模型,并使用它的上下文从/向数据库获取/设置数据。所以我想我会传递一个 Employee 字符串化对象作为参数,然后用我的控制器反序列化它。

4

2 回答 2

1

在我看来,您选择的不是实现需求的最佳方式。从您发布的代码中可以看出您想要使用本地编辑(editRowurl: "clientArray"的选项),但您还希望在保存行后执行一些额外的操作。在这种情况下,最好的选择可能是使用回调。所以调用可能是这样的aftersavefunceditRow

onSelectRow: function (id) {
    var $this = $(this);
    ...
    $this.jqGrid("editRow", id, {
        keys: true,
        url: "clientArray",
        aftersavefunc: function (rowid) {
            $.post("Home/Save",
                JSON.stringify($this.jqGrid("getRowData", rowid)));
        }
    });
    ....
}

我不确定您希望如何将数据发送到Home/SaveURL。您使用inputEmployee了没有任何值的参数。您可以根据您的确切要求调整上面的代码。

于 2013-02-07T09:27:48.597 回答
0

您可以利用 jQuerys 的 .data() 方法来获取元素的现有事件处理程序

基本上你

  • 获取旧的处理程序
  • 删除事件
  • 添加您自己的处理程序
    • 必要时执行原始处理程序

这是一个例子

    var el = $(document)
    el.on("keydown",function (e) {
       console.log("First Event"); //Set the first Handler
    });

    var h = jQuery._data( document, "events" ).keydown[0].handler; //The (first) Handler

    el.off("keydown",h)

    el.on("keydown",function (e) {
        console.log("Second Handler")
        h(e);
    });

然后输出看起来像

//Second Handler
//First Handler

我记得我曾经这样做过,el.data("events")似乎已被弃用

于 2013-02-07T09:12:59.870 回答