自定义键绑定以覆盖现有键

时间:2013-02-07 08:46:50

标签: c# javascript jquery asp.net-mvc-3 jqgrid

大家好我正在使用可编辑的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字符串化对象作为参数传递,然后用我的控制器反序列化它。

2 个答案:

答案 0 :(得分:1)

在我看来,您选择的不是实施要求的最佳方式。从您发布的代码中可以看到您想要使用本地编辑(editRowurl: "clientArray"选项),但是您希望在保存之后另外执行一些附加操作行。在这种情况下,最好的选择可能是使用aftersavefunc回调。因此editRow的调用可能类似于

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/Save网址。您使用了inputEmployee参数,没有任何值。您可以根据您的具体要求调整上述代码。

答案 1 :(得分: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);
    });

然后是output would look like

//Second Handler
//First Handler

我记得曾经像el.data("events")那样做seems deprecated