Jqgrid Master Detail不发送相应的信息

时间:2011-09-29 15:27:43

标签: c# asp.net-mvc jqgrid master-detail

我在这里搜索我的问题并找到一些提示,但无论如何都不起作用,我的问题是:

在jqgrid Javascrip中,我发送setGridParam:{url:'myurl/myfunction/'+ id, page:1, datatype:"json"}但是,Jgqgrid仍然没有向我的控制器发送用于选择细节的Id,它总是为空....我尝试了各种问题并且问题仍然存在,请帮助我。

这是我的Javascript:

<script type="text/javascript">
    jQuery(document).ready(function() {
        jQuery("#list").jqGrid({
        url: '/Master/GridData/',
            datatype: 'json',
            mtype: 'GET',
            colNames: ['Id', 'Descripción'],
            colModel: [
                        { name: 'Id', index: 'Id', width: 50 },
                        { name: 'Descripcion', index: 'Descripcion', width: 80, sortable: true, editable: true, edittype: "text", editoptions: { maxlength: "100"} }
                      ],
            pager: jQuery('#pager'),

            autowidth: true,
            rowList: [5, 10, 20, 50],
            sortname: 'Id',
            sortorder: "asc",
            viewrecords: true,
            caption: '<b>Listado de Masters</b>',
            onSelectRow: function(ids) {
                if (ids != null) {
                    var data = $("#list").getRowData(ids);
                    jQuery("#DetailList").setGridParam({ url: "/Master/DetailGridData/" + data.Id, page: 1, datatype: 'json' })
           .setCaption("<b>Details of Master : " + data.Descripcion+"</b>")
           .trigger('reloadGrid');
                }
            }
        }).navGrid(pager, { edit: false, add: false, del: false, refresh: true, search: false });
        jQuery("#DetailList").jqGrid
        ({
            height: 100,
            datatype: "json",
            colNames: ['Id', 'Descripción', 'Modelo'],
            colModel: [
                        { name: 'Id', index: 'Id', width: 50 },
                        { name: 'Descripcion', index: 'Descripcion', width: 80, sortable: true, editable: true, edittype: "text", editoptions: { maxlength: "100"} },
                        { name: 'Modelo', index: 'Modelo', width: 80, sortable: true, editable: true, edittype: "text", editoptions: { maxlength: "100"} }                            
                      ],
            rowNum: 5,
            rowList: [5, 10, 20],
            pager: jQuery('#DetailPager'),
            sortname: 'Id',
            viewrecords: true,
            sortorder: "desc"
        }).navGrid('#DetailPager', { add: false, edit: false, del: false, search: false });
    });
</script>

这是我的控制器代码:

    public ActionResult GridData(string sidx, string sord, int? page, int? rows)
    {

        List<Master> ms = new List<Master>();
        ms = MasterRepository.GetAll().ToList<Master>();

        int pageIndex = Convert.ToInt32(page) - 1;
        int totalrecords = ms.Count();
        int totalpages = (int)Math.Ceiling((decimal)totalrecords / (decimal)rows);

        var jsonData = new
        {
            sidx = "Id",
            sord = "asc",
            page = 1,
            records = 25,
            rows = (
                    from ch in ms
                    select new
                    {
                        id = ch.Id,
                        cell = new string[] 
                            {
                                ch.Id.ToString(),
                                ch.Descripcion,
                            }
                    }).ToArray(),

        };

        return Json(jsonData, JsonRequestBehavior.AllowGet);
    }



    public ActionResult DetailGridData(string IdMaster, string sidx, string sord, int? page, int? rows)
    {

        int IdCh = Convert.ToInt32(IdMaster);

        IList<Detail> det = new List<Detail>();
        det = DetailRepository.GetByMaster(IdCh).ToList<Detail>();

        int pageIndex = Convert.ToInt32(page) - 1;
        int totalrecords = det.Count();

        var jsonData = new
        {
            sidx = "Id",
            sord = "asc",
            page = 1,
            records = 25,
            rows = (
                    from bah in det
                    select new
                    {
                        id = bah.Id,
                        cell = new string[] 
                            {
                                bah.Id.ToString(),
                                bah.Descripcion,
                                bah.Modelo                                   
                            }
                    }).ToArray(),
        };
        return Json(jsonData, JsonRequestBehavior.AllowGet);
    }
}
}

3 个答案:

答案 0 :(得分:1)

我认为您应该验证添加到路由表中的routes.MapRoute。您是否真的使用IdMaster参数,或者应将其重命名为Id?可能是您忘记添加自定义规则。

我能看到的另一个问题是语法错误:你使用

.navGrid(pager, {...

而不是

.navGrid('#pager', {...

(未定义变量pager)。

另一个可能的问题是id重复。确保详细网格的ID具有其他值作为主网格中的ID。因为id是字符串,所以你可以使用id的前缀:例如主网格为'm_'+ch.Id,详细网格为'd_'+bah.Id

更多评论:

  • sidxsord不应包含在服务器的JSON响应中。应该包括total而不是datatype: "local"。有关详细信息,请参阅here
  • 我建议您使用datatype: "json"代替pager: '#pager'来获取详细信息网格定义。它将阻止尝试在网格初始化时加载数据。
  • 我建议您使用pager: jQuery('#pager')代替key: true
  • 我建议您在'Id'列中使用Id。在这种情况下,您不需要两次发送jsonReader: {cell:''}值。如果您另外使用cell,则可以从id数据中删除rows属性,例如from ch in ms select new { new string[] { ch.Id.ToString(), ch.Descripcion }}).ToList()属性。因此,您可以使用以下{{1}}。例如,请参阅herehere
  • 我建议您在代码开头的jqGrid上使用错误处理。使用the answer查看the demo project的更新部分。显示错误消息可以节省很多调试时间。作为使用jqGrid的ASP.NET MVC代码示例,该演示可能很有趣。

答案 1 :(得分:0)

我认为url字符串格式存在问题。它应该像

jQuery(“#DetailList”)。setGridParam({url:“/ Master / DetailGridData / ?id =” + data.Id,page:1,datatype:'json'})< / p>

答案 2 :(得分:0)

我终于找到了解决方案,感谢aamir和Oleg的建议。

我必须做的是以下内容:

首先通过IdMaster更改MasterGrid中的名称Id,因此不会与详细网格的ID混淆,然后通过以下方式更正setGridParam发送的行:

jQuery("#DetailList").setGridParam({ datatype: 'json', url: "/Master/DetailGridData?IdMaster=" + data.IdMaster, page: 1 })

就是这样,现在一切正常...... !! ;)

再次感谢aamir和Oleg ......你救了我的一天...... !!