【问题标题】:Custom Keybindings to Override existing ones自定义键绑定以覆盖现有键绑定
【发布时间】:2013-02-07 08:46:50
【问题描述】:

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

【问题讨论】:

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


    【解决方案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 URL。您使用了没有任何值的 inputEmployee 参数。您可以根据您的确切要求调整上述代码。

    【讨论】:

    • 我认为这可以帮助我。我已经用 HomeController 中的 Save 方法更新了我的问题,所以如果可以的话,你可以评论我的 jQuery 帖子。
    • @PanagiotisPalladinos:我认为您应该使用$.post("Home/Save", {inputEmployee: JSON.stringify($this.jqGrid("getRowData", rowid))});$.post("Home/Save", JSON.stringify({inputEmployee: $this.jqGrid("getRowData", rowid)})); 之类的内容,具体取决于您的其他设置。
    • 太棒了!第一个选项奏效了。现在我在使用 LINQ to SQL 更新一行时遇到了问题,但这是另一个故事,因为数据已正确传递给控制器​​,呵呵。谢谢你的回答!
    • @PanagiotisPalladinos:不客气!顺便说一句,您有权每天对 30 个有用的问题和答案进行投票(请参阅 here),您可以在 stackoverflow 上找到这些问题和答案。权利的目标主要不是为了增加答案的声誉。 搜索引擎使用投票进行排序。因此,如果您想帮助其他访问者找到有关 stackoverflow 的有用信息,您应该更多地使用您的投票权。
    【解决方案2】:

    您可以利用 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 这样做

    【讨论】:

      猜你喜欢
      • 2011-07-16
      • 1970-01-01
      • 2019-11-16
      • 1970-01-01
      • 2013-03-31
      • 2019-10-28
      • 2011-08-03
      • 1970-01-01
      • 2010-10-15
      相关资源
      最近更新 更多