用Jqgrid在MVC里折腾MongoDB数据那些事儿,边学边记点心得
- 问答
- 2026-01-06 14:55:09
- 7
(一)
最近在项目里用Jqgrid显示MongoDB的数据,真是踩了不少坑,也学到点东西,MVC框架是ASP.NET MVC,数据库是MongoDB,前端表格用的是Jqgrid,这三样东西凑一块儿,刚开始真有点不知道怎么下手,网上找的资料吧,要么是Jqgrid配SQL Server的,要么是讲MongoDB用法的,专门把它们串起来的完整例子不多,只能自己摸着石头过河。
首先一个大问题就是,Jqgrid默认期待的数据格式是JSON,但它期望的JSON结构挺固定的,它要一个total表示总页数,page表示当前第几页,records表示总记录数,然后rows里面才是具体的数据数组,MongoDB通过C#驱动查出来的数据,直接序列化成JSON,根本就不是这个结构,直接塞给Jqgrid,它肯定不认。
(二)
那怎么办呢?得在服务端做个转换,我的做法是在MVC的Controller里,先获取MongoDB的数据,这里涉及到分页和排序,Jqgrid会把页码(page)、每页大小(rows)、排序字段(sidx)、排序方式(sord)这些参数传过来,我得用这些参数去构造MongoDB的查询。
要获取总数,得用CountAsync方法,然后获取当前页的数据,要用Skip和Limit方法,Skip的值是 (page - 1) * rows,排序的话,要用Sort方法,根据sidx和sord拼成一个排序定义,这些操作都可以用MongoDB的C#驱动提供的链式调用完成,还算直观。
数据查出来是一个对象列表,我不能直接返回给它,我得手动构造一个Jqgrid能识别的匿名对象,像下面这样:
return Json(new { total = totalPages, page = currentPage, records = totalRecords, rows = dataList // 这个dataList是当前页的数据 }, JsonRequestBehavior.AllowGet);
这样返回的JSON,Jqgrid前端就能正确解析了。
(三)
另一个折腾的地方是列模型(colModel)的定义,Jqgrid的列需要明确指定name和index属性,这个name一般和数据的属性名对应上,但MongoDB的文档是BSON,有时候字段名是驼峰的,比如userName,有时候可能还带点嵌套,这时候就要注意了,要么在服务端查询时做一下投影,把数据拍平,或者把字段名转换一下;要么在Jqgrid的colModel里,通过jsonmap来指定映射关系。
我一开始没注意,name没写对,或者index没设置,结果表格要么显示不出来数据,要么排序点不了,后来才弄明白,index属性在服务器端排序时很重要,它告诉服务端按哪个字段排序,如果index的名字和传到后台的sidx参数对不上,排序就失效了。
(四)
还有编辑功能也挺费劲,Jqgrid支持行内编辑和表单编辑,我想实现行内编辑,就是点一下某个单元格就能修改,这需要配置cellEdit: true,并且要处理cellsubmit事件,这里有个关键点,编辑完后,数据是怎么提交到服务器的。
Jqgrid默认的cellsubmit是'remote',它会发起一个AJAX请求到服务器,请求的URL是在创建Jqgrid时设置的editurl,这个editurl指向一个MVC的Action方法,在这个方法里,我要接收修改后的数据,然后去更新MongoDB。
问题是,它提交的数据也是键值对形式,我需要根据主键ID(MongoDB的_id)找到那条记录,然后更新指定的字段,MongoDB的_id在C#里是ObjectId类型,而从前端传过来的通常是个字符串,这里需要做个类型转换,我用的是ObjectId.Parse方法来转换。
更新操作我用的是驱动提供的UpdateOneAsync方法,用Builders<T>.Update.Set来设置字段的新值,这里要确保字段名和数据库里的完全一致。
(五)
感觉整个过程,大部分精力都花在了“对接”上,就是让Jqgrid的理解方式和MongoDB的查询、更新方式能够互通,MVC的Controller在这里扮演了一个翻译官的角色,把Jqgrid的请求“翻译”成MongoDB能听懂的查询语言,再把MongoDB返回的结果“翻译”成Jqgrid能看懂的JSON格式。
虽然折腾,但弄通了之后还是挺有成就感的,尤其是看到表格能正常显示、分页、排序,还能直接编辑保存到MongoDB里,觉得前面的坑都没白踩,我觉得关键还是要理解每一层(前端Jqgrid、中间MVC、后端MongoDB)各自的工作方式和它们之间数据交换的格式要求,然后耐心地在中间做适配,下次再遇到类似的需求,应该会顺手很多。

本文由颜泰平于2026-01-06发表在笙亿网络策划,如有疑问,请联系我们。
本文链接:http://waw.haoid.cn/wenda/75631.html
