如何在JsonResult中按日期及单据号后缀规则降序排序?
实现自定义降序排序(C#后端 + jqGrid前端)
我来帮你搞定这个排序需求,咱们分后端C#处理和前端jqGrid配置两部分来调整:
一、后端C#代码修改
你需要在生成JSON数据的LINQ查询中加入排序逻辑,先按日期(INDENTDATE)降序,再按INDENTNO最后三位数字降序。修改GetStoreIndNo方法中生成jsondata的部分:
var jsondata = new { rows = (from DataRow row in load.Rows // 先按日期降序:将字符串日期转成DateTime类型确保排序准确 orderby DateTime.ParseExact(("" + row["INDENTDATE"]).Trim(), "dd/MM/yyyy", null) descending, // 再按INDENTNO最后三位数字降序:提取最后三位转成int排序 int.Parse(("" + row["INDENTNO"]).Trim().Substring(("" + row["INDENTNO"]).Trim().Length - 3)) descending select new { id = ("" + row["INDENTNO"]).Trim(), cell = new string[] { GeneralFunction.GetDate(("" + row["INDENTDATE"]).Trim()), ("" + row["INDENTNO"]).Trim() } }).ToArray() };
注意事项:
- 日期解析用
ParseExact指定dd/MM/yyyy格式,避免因系统文化差异导致的解析错误; - 如果
INDENTNO存在长度不足3的情况,建议加个安全判断,避免报错:
然后用int.TryParse(("" + row["INDENTNO"]).Trim().Substring(Math.Max(0, ("" + row["INDENTNO"]).Trim().Length - 3)), out int indentSuffix)indentSuffix参与排序。
二、前端jqGrid配置调整
因为后端已经返回排好序的数据,你可以调整jqGrid的排序相关配置,确保前端直接使用已排序的结果:
排序状态配置:
- 如果你不需要前端触发二次排序,直接删除
sortname: 'id', sortorder: 'desc'这两行; - 如果想保留排序状态的显示,也可以保留这两行,因为
loadonce: true会让jqGrid默认使用后端返回的排序结果。
- 如果你不需要前端触发二次排序,直接删除
列映射校验:
你的colModel顺序是INDDATE、INDENTNO,后端cell数组也是日期在前、编号在后,这部分匹配没问题,不需要调整。
额外优化(可选)
如果需要前端也支持按自定义规则排序(比如用户点击表头时),可以给INDENTNO列添加自定义排序函数:
{ name: 'INDENTNO', index: 'INDENTNO', width: 140, editable: false, sorttype: function(cellvalue) { // 提取最后三位转成数字用于排序 return parseInt(cellvalue.substring(cellvalue.length - 3)); } }
同时把sortableColumns设为true,让用户可以点击表头触发排序。
内容的提问来源于stack exchange,提问作者user8763759
相关产品推荐
相关产品推荐

