【问题标题】:Delete ID always 0 in Jqgrid在Jqgrid中删除ID始终为0
【发布时间】:2013-06-17 10:06:35
【问题描述】:

JqGrid 编辑功能在我的网格中运行良好,但删除功能始终将记录 ID 传递为 0。

@model Shop.Models.ShopModels.lstMainCategory
<table id="list" class="scroll" cellpadding="0" cellspacing="0"></table>
    <div id="pager" class="scroll" style="text-align:center;"></div>                                                            

    <script type="text/javascript">

        var myGrid = $('#list');
        $(document).ready(function () {

            $.jgrid.nav.addtext = "Add";
            $.jgrid.nav.edittext = "Edit";
            $.jgrid.nav.deltext = "Delete";
            $.jgrid.edit.addCaption = "Add Main Category";
            $.jgrid.edit.closeAfterAdd = true;
            $.jgrid.edit.closeAfterEdit = true;
            $.jgrid.edit.editCaption = "Edit Main Category";
            $.jgrid.del.caption = "Delete Main Category";
            $.jgrid.del.msg = "Delete selected Main Category?";

            $.extend($.jgrid.edit, {
                beforeSubmit: function () {
                    $(this).jqGrid("setGridParam", { datatype: "json" });
                    return [true, "", ""];
                }
            });

            $("#list").jqGrid({
                url: '/MainCategory/DynamicGridData/',
                datatype: 'json',
                mtype: 'GET',

                colNames: ['Edit', 'Main Category'],
                colModel: [
         { name: 'MaincategoryID', index: 'MaincategoryID', width: 40, align: 'left', /* key: true,*/editable: true, editrules: { edithidden: false }, hidedlg: true, hidden: true },
         { name: 'MainCategoryName', index: 'MainCategoryName', search: true, width: 700, align: 'left', editable: true, edittype: 'text', editrules: { required: true }, formoptions: { elmsuffix: ' *'} }],
                pager: jQuery('#pager'),
                editurl: '@Url.Action("Update", "MainCategory")',
                rowNum: 10,
                width: '100%',
                height: '100%',
                rowList: [5, 10, 20, 50],
                viewrecords: true,
                loadonce: true,
                ignoreCase: true,
                caption: 'Main Categories'

            }).navGrid('#pager', { edit: true, add: true, del: true, search: true, searchtext: "Search" });

            $("#list").jqGrid('filterToolbar', { stringResult: true, searchOnEnter: false, defaultSearch: 'cn' });

            $("#list").setGridParam({ data: results.rows, localReader: reader }).trigger('reloadGrid');


    </script>

控制器:

  public ActionResult Update(lstMainCategory viewModel, FormCollection formCollection)
        {
            var operation = formCollection["oper"];
            lstMainCategory mcat = new lstMainCategory();
            rep = new MaincategoryRepository();
            if (operation.Equals("add"))
            {              

                mcat.MainCategoryName = viewModel.MainCategoryName;
                rep.Create(mcat);
                rep.Save();
            }
            else if (operation.Equals("edit"))
            {
                mcat.MaincategoryID = viewModel.MaincategoryID;
                mcat.MainCategoryName = viewModel.MainCategoryName;
                rep.Edit(mcat);
                rep.Save();
            }
            else if (operation.Equals("del"))
            {

                rep.Delete(viewModel.MaincategoryID);//here MaincategoryID is always 0 so it's not working
                rep.Save();
            }

            return Content("true");
        }

编辑

MainCategoryID  MainCategory
16           aaa
17           bbb

存储库:

 public object DynamicGridData(string sidx, string sord, int page, int rows, bool _search, string searchField, string searchOper, string searchString)
        {

            dc = new ShopDataContext(DBConnection.Connection);

            int pageIndex = Convert.ToInt32(page) - 1;
            int pageSize = rows;
            int totalRecords = dc.tblMainCategories.Count();
            int totalPages = (int)Math.Ceiling((float)totalRecords / (float)pageSize);

            List<MainCategory> lst = (from tbm in dc.tblMainCategories
                                select new MainCategory
                                {
                                    MaincategoryID=tbm.MainCategoryID,
                                    MainCategoryName=tbm.MainCategory,
                                    DeleteID=tbm.MainCategoryID
                                }).ToList<MainCategory>().OrderBy(x=>x.MainCategoryName).ToList();

            List<MainCategory> Flst;



            if (_search && searchField == "MainCategory")
            {
                Flst = lst.Where(r => r.MainCategoryName.Contains(searchString)).OrderBy(x => x.MainCategoryName).ToList().ToList();
            }
            else
                Flst = lst;


            var GridData = new
            {
                total = totalPages,
                page = page,
                records = totalRecords,
                rows = (
                    from mcat in Flst
                    select new
                    {
                        i = mcat.MaincategoryID,
                        cell = new string[] { mcat.MaincategoryID.ToString(), mcat.MainCategoryName.ToString(),mcat.DeleteID.ToString() }
                    }).ToArray()
            };

            return GridData;
        }

【问题讨论】:

  • 您使用哪些数据来填充网格?你能发布两行数据吗?您想向用户显示包含MaincategoryID 的内容吗?哪个值有id 用于网格?
  • 重要的是从'/MainCategory/DynamicGridData/' 返回的准确的 JSON 响应。带有虚拟值的表没有提供额外信息。你用什么作为id(rowid)?
  • @Oleg MaincategoryID 是我想在控制器中的删除操作中传递的 ID,我不想将其显示给用户。我添加了两行数据
  • 能否包含从“/MainCategory/DynamicGridData/”返回的准确 JSON 响应?您可以使用Fiddler、Firebug 或 IE 的开发者工具来捕获 HTTP 流量。我重复我之前的问题:你想向用户显示 MaincategoryID 的包含吗?
  • 您之前的回答 (var jsonData = rep.DynamicGridData(sidx, sord, page, rows, _search, searchField, searchOper, searchString);) 中的代码没有提供有关您在服务器响应中使用的数据格式的信息

标签: jquery asp.net asp.net-mvc jqgrid


【解决方案1】:

首先你应该修正你使用的服务器响应的格式。它没有i 属性,但有id 属性。线

i = mcat.MaincategoryID,

必须固定到

id = mcat.MaincategoryID,

你可以替换代码

rows = (
    from mcat in Flst
    select new
    {
        i = mcat.MaincategoryID,
        cell = new string[] { mcat.MaincategoryID.ToString(), mcat.MainCategoryName.ToString(),mcat.DeleteID.ToString() }
    }).ToArray()

rows = (
    from mcat in Flst
    select new[] {
        mcat.MaincategoryID.ToString(),
        mcat.MainCategoryName,
        mcat.DeleteID.ToString()
    }).ToArray()

不要重复相同的信息(发送mcat.MaincategoryID 两次)并从您发送的每个项目中删除"id:""cell:" 字符串。要在客户端读取如此紧凑的数据,您应该将jsonReader: { cell: "" } 选项添加到 jqGrid。如果您使用最新版本的 jqGrid,则该选项是可选的。

如果您希望发送包含MaincategoryID 列的内容,您应该在MaincategoryID 列中使用editrules: { edithidden: true } 选项(请参阅the answer)。或者,您可以添加prmNames: {id: "MaincategoryID"}。在这种情况下,jqGrid 会将 rowid 作为“MaincategoryID”而不是默认值 "id" 发送。

如果您不需要显示MaincategoryID 列,则可以将其从colModel 中删除。在这种情况下,您可以将服务器返回的数据顺序更改为

rows = (
    from mcat in Flst
    select new[] {
        mcat.MainCategoryName,
        mcat.MaincategoryID.ToString(),
        mcat.DeleteID.ToString()
    }).ToArray()

jqGrid 中的变化将是

colNames: ['Edit', 'Main Category'],
colModel: [
    { name: 'MainCategoryName', width: 700, editable: true,
        editrules: { required: true }, formoptions: { elmsuffix: ' *'} }
],
pager: "#pager",
gridview: true,
jsonReader: {cell: "", id: 1},
prmNames: {id: "MaincategoryID"}

jqGrid 将id 属性分配给每一行(每个&lt;tr&gt;)。使用sonReader: {id: 1} 通知jqGrid 从行数据的第二项(mcat.MaincategoryID.ToString())中获取rowid。其他更改pager: "#pager"gridview: true 与我之前在the answer 中写给您的相同。您应该从&lt;table id="list" ...&lt;div id="paber" ... 中另外删除垃圾(请参阅我的旧答案)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-10
    • 2014-01-09
    • 1970-01-01
    • 2011-08-15
    • 1970-01-01
    相关资源
    最近更新 更多