【问题标题】:Jqgrid Add/update/delete with form modalJqgrid 使用表单模式添加/更新/删除
【发布时间】:2017-12-26 17:51:20
【问题描述】:

我正在使用带有 MVC c# 的 jqgrid 免费版本(最新)。 我已经用我的数据设置了它,一切正常。我在页脚也确实有带有添加、编辑、删除功能的工具栏,单击该工具栏时会显示配置了所有表单元素的模式表单。我遇到的问题是:

  1. 如何让我的模态弹出窗口的所有表单元素 例如,我的 col 模型中有这个:

    { name: 'name', index: 'name', width: 90, sorttype: "text", editrules: { required: true }}
    

    当用户单击添加/编辑行时,我将名称作为弹出窗口中的字段之一。那么如何获取用户更新的这个字段值并将其传递给我的 mvc 控制器。

  2. 第二个问题是我可以通过哪种方法获取这些值以进行添加/编辑/删除?我想获取这些值并使用 ajax 来调用我的服务器端方法。

  3. 最后我应该如何在添加/编辑/删除之后刷新网格。

更新:我正在使用以下代码:

 <script type="text/javascript">
    $(function () {
        "use strict";
        var $grid = $("#list");             
        $grid.jqGrid({
            url: '@Url.Action("GetData", "Home")',
            datatype: "json",
            mtype: 'Get',
            colNames: ['Id', 'Name', 'Sex', 'Address'],
            loadonce: true,
            height: '100%',
            autowidth: true,
   colModel: [
                { name: 'uid', index: 'uid', editable: true,  editrules: { required: true}},
                { name: 'name', index: 'name', editable: true,  editrules: { required: true}},
                { name: 'sex', index: 'sex', editable: true,  editrules: { required: true}},
                { name: 'address', index: 'address', editable: true,  editrules: { required: true}}
     ],
            cmTemplate: { autoResizable: true, editable: true },
            autoResizing: { compact: true, resetWidthOrg: true },                
            iconSet: "fontAwesome",
            rowNum: 10,
            rowList: [5, 10, 20, "10000:All"],
            viewrecords: true,
            autoencode: true,
            sortable: true,              
            pager: true,
            rownumbers: true,
            sortname: "uid",
            sortorder: "desc",
            pagerRightWidth: 150,
            afterAddRow: function () {

            },
            afterSetRow: function () {

            },
            afterDelRow: function () {

            },
            inlineEditing: {
                keys: true
            },
            formEditing: {
                width: 310,
                closeOnEscape: true,
                closeAfterEdit: true,
                savekey: [true, 13]
            },
            searching: {                    
                loadFilterDefaults: false,
                closeOnEscape: true,
                searchOperators: true,
                searchOnEnter: true
            },

            caption: "MyData"
        }).jqGrid("navGrid")
        .editGridRow("new", properties);              
    });
   </script>

上面哪里可以使用 ajax 来调用我的 mvc 控制器:

    $.ajax({
       url: '/Home/AddNew',
       type: 'POST',
       async: false,
       dataType: 'json',
       processData: false,
       data: {
                //I try to use below code to get value but it returned null
                uid: $('input#uid').val()
             },
        success: function (data) { }
       });  

【问题讨论】:

  • 如果您发布更多您使用的完整 JavaScript 代码将会很有帮助。您是否使用 editurl 选项和一些 URL 到您的控制器操作?您可以使用开发人员工具并检查网络选项卡以查看,在所有添加/编辑/删除操作的情况下,哪些信息将发送到editurl URL。最后,您应该对您的问题使用正确的标签。您可以检查jqgrid-asp.net 以查看它是用于商业 产品的。如果你使用“free jqGrid”,你应该替换它free-jqgrid
  • 嗨,oleg 我已经包含了我的代码并删除了标签。所以我再次想知道的是如何获取模态弹出窗口中的表单元素,获取这些事件并将其传递给我的 ajax 方法,然后如何刷新网格。谢谢
  • 您是否尝试将editurl 选项添加到jqGrid?您将能够在开发者工具的网络选项卡中看到发布的数据。该格式记录在hereherehere。很容易实现相应的 ASP.NET MVC 动作,处理服务器上的请求。
  • 我添加了 editurl: '/Home/AddNew' 并且它确实有效,并且我得到了表单的所有参数以及操作。所以想检查除了表单参数之外我如何传递一个额外的参数。还有如何手动刷新网格。
  • 有很多方法可以做到这一点。主要问题:我尝试保持与旧版本的 jqGrid(版本 不同回调。您使用当前的表单编辑并发布可以使用的附加参数,例如从onclickSubmit 回调或从 jqGridAddEditClickSubmit jQuery 事件返回的对象。例如,您可以在formEditing 中包含onclickSubmit: function (options, postdata, editOrAdd) { return { myparam: $("#someInput").val() }; }

标签: jquery jqgrid free-jqgrid


【解决方案1】:

我认为在 jqGrid 中编辑的工作方式存在一些误解。 jqGrid存在editurl参数,在free jqGrid中默认值为"clientArray"。这意味着数据的更改将在本地完成,而不会将任何数据发布到服务器。如果您指定例如editurl: '/Home/Change',那么 jqGrid 会将数据修改发布到服务器,Change 操作应该执行添加、编辑或删除数据。

如果您希望发送附加数据和编辑数据,那么您应该为此使用附加选项/回调。选项/回调取决于您使用的编辑模式。您使用当前的表单编辑。确切地说,您使用navGrid 方法,它添加了带有添加/编辑/删除按钮的导航栏。用户点击按钮后,填写相应的表格并按下提交按钮 jqGrid (navGrid) 执行editGridRowdelGridRow 方法。通过指定jqGrid的formEditingformDeleting选项内部的选项,可以使用navGridnavGrid的选项来控制navGrid在调用editGridRowdelGridRow方法期间使用的选项。例如,您可以将代码修改为

cmTemplate: { autoResizable: true, editable: true },
editurl: "/Home/Change",
formEditing: {
    width: 310,
    closeOnEscape: true,
    closeAfterEdit: true,
    savekey: [true, 13],
    onclickSubmit: function (options, postData, editOrAdd) {
        return {
            myparam: $("#someInput").val()
        };
    }
},
formDeleting: {
    onclickSubmit: function (options, postData, formRowIds) {
        return {
            myDelParam: $("#someInput").val()
        };
    }
}

以上代码将默认编辑参数发送到服务器附加参数myparammyDelParam。从onclickSubmit返回的对象将与jqGrid的其他编辑数据的对象合并。因此,发送更多作为一个附加参数,您只需返回具有更多作为一个属性的对象。

如果您不想将通用 URL editurl 用于所有编辑操作,您可以使用 url 选项定义inside of formEditing 或/和formDeleting。如果需要,您可以使用定义为函数的url。例如,

cmTemplate: { autoResizable: true, editable: true },
formEditing: {
    url: function (rowid, editOrAdd, postData, options) {
        // editOrAdd is "add" or "edit"
        return editOrAdd === "add" ? "/Home/Add" : "/Home/Edit";
    },
    width: 310,
    closeOnEscape: true,
    closeAfterEdit: true,
    savekey: [true, 13],
    onclickSubmit: function (options, postData, editOrAdd) {
        if (editOrAdd === "add") {
            return {
                myAddParam: $("#someInput").val()
            };
        } else {
            return {
                myEditParam: $("#someInput").val()
            };
        }
    }
},
formDeleting: {
    url: "/Home/Delete",
    onclickSubmit: function (options, postData, formRowIds) {
        return {
            myDelParam: $("#someInput").val()
        };
    }
}

更新:在使用loadonce: true的情况下重新加载修改后的数据从服务器可以在formEditingformDeleting中添加reloadGridOptions: { fromServer: true }选项和navOptions。喜欢

cmTemplate: { autoResizable: true, editable: true },
formEditing: {
    url: function (rowid, editOrAdd, postData, options) {
        // editOrAdd is "add" or "edit"
        return editOrAdd === "add" ? "/Home/Add" : "/Home/Edit";
    },
    width: 310,
    closeOnEscape: true,
    closeAfterEdit: true,
    savekey: [true, 13],
    reloadGridOptions: { fromServer: true },
    onclickSubmit: function (options, postData, editOrAdd) {
        if (editOrAdd === "add") {
            return {
                myAddParam: $("#someInput").val()
            };
        } else {
            return {
                myEditParam: $("#someInput").val()
            };
        }
    }
},
formDeleting: {
    url: "/Home/Delete",
    reloadGridOptions: { fromServer: true },
    onclickSubmit: function (options, postData, formRowIds) {
        return {
            myDelParam: $("#someInput").val()
        };
    }
},
navOptions: {
    reloadGridOptions: { fromServer: true }
}

选项fromServer: true将转发到reloadGrid事件,数据将从服务器加载,而不是本地重新加载。

【讨论】:

  • 谢谢奥列格,我现在开始工作了。唯一的事情是在添加/编辑/删除期间,网格不会自动刷新更新。我必须刷新页面才能看到更改。我什至在 formEditiing 中添加了 reloadAfterSubmit:true 但仍然没有刷新。此外,当我单击下方工具栏中的刷新按钮时,它什么也不做。
  • @aman:不客气!这可能是问题的多种原因。第一个:您可能在服务器端遇到一些缓存问题。我个人在所有 GET 方法中添加了HttpContext.Current.Response.Cache.SetMaxAge (new TimeSpan (0)); 行。它添加了 HTTP 头 Cache-Control: private, max-age=0,它总是将数据发送到服务器。
  • @aman:如果您使用loadonce: true,第二个原因可能在客户端。可以从以前加载的数据本地重新加载数据(例如在之前的过滤之后)。要强制从服务器重新加载,必须将 datatype 从“本地”重置回“json”。 reloadGrid 的选项 fromServer: true 在这里有帮助。 formEditingformDeletingnavOptionsreloadGridOptions: { fromServer: true } 选项可以在这里提供帮助。请参阅我的回答的已更新部分
  • reloadGridOptions: { fromServer: true } 工作正常。现在一切正常。添加/编辑/删除。我对 jqgrid 的样式有疑问,我应该在这里问还是应该打开一个新线程。
  • @aman:最好总是在单独的线程中提出新问题,因为问题/答案将被索引并被搜索引擎使用。 stackoverflow 的其他用户可以更好地索引和查找更具体的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-08-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-20
相关资源
最近更新 更多