随笔 - 268  文章 - 0  评论 - 1028  阅读 - 160万

jqGrid的autoencode参数设置为true在客户端可能引发的编码问题

不久前使用jqGrid+MVC做过一段时间开发。

一开始,分页参数几乎都是默认值,jqGrid的分页功能很好用。

考虑到each input is evil,我们的系统对安全性又有较高要求,所以,为了保证输入和输出都比较可靠,找了一下网上的资料,发现autoencode参数能满足需求。

By the way,参考了很多关于jqGrid使用的中文参考文章,大部分都只说是对url进行编码,讲的很不明确,后面还会对我排查问题造成不小的干扰。

 

除了分页之外,我们还需要在列表的最后一列加上操作列,实现诸如常见的更新、删除等操作。然后就发现了问题:在操作列发现了乱码。

比如有一个分页列表,最后一个操作列加上“编辑”和“删除”链接,按照jqGrid的常用做法,我们是在gridComplete回调函数中通过简单拼接字符串实现编辑和删除效果的,示例代码大致如下:

复制代码
        gridComplete: function () {
                    var ids = jQuery("#yourGridtable").jqGrid('getDataIDs');
                    for (var i = 0; i < ids.length; i++) {
                        var itemID = ids[i];
                        var strUpdate = "<a href='javascript:;' class='update' name='btnEdit' id='btnEdit_" + itemID + "'>修改</a>&nbsp;|&nbsp;";
                        var strDel = "<a href='javascript:;' class='del' name='btnDelete' id='btnDelete_" + itemID + "'>删除</a>";
                        $("#yourGridtable").jqGrid('setRowData', ids[i], { UserAction: strUpdate + strDel });
                    }

                    setTimeout(function () {
                         //todo 设置编辑效果
                         //todo 设置删除效果
                    }, 200);
                }
gridComplete
复制代码

可是,拼接后的字符串在页面中显示是html编码后的效果,根本没有出现“修改”和“删除”链接。

出现该问题的第一反应是字符串没拼接正确,检查后发现不是这个原因。

然后,我在参考了一堆资料排查了n个参数未果之后,最后跟进jqGrid的源代码里才发现是autoencode这个参数设置为true造成的。

参考官方wiki,发现autoencode这个参数的说明如下:

    When set to true encodes (html encode) the incoming (from server) and posted data (from editing modules). For example < will be converted to &lt;.

翻译过来,就是:当该参数设置为true,对客户端请求和服务端返回数据都进行html编码,比如<被编码成&lt;

html编码的原理也很简单,也就是几个特殊符号的转义而已,贴一下jqGrid的html编码实现源代码:

   htmlEncode : function (value){
        return !value ? value : String(value).replace(/&/g, "&amp;").replace(/\"/g, "&quot;").replace(/</g, "&lt;").replace(/>/g, "&gt;");
    }

所以我怀疑出现乱码的原因就是,gridComplete回调函数触发执行的时候,内部逻辑间接调用了jqGrid的html编码函数htmlEncode(动态添加行数据addRowData函数内部可能调用了html编码逻辑)。

把autoencode参数设置为false,果然正常。

 本来懒得再码关于前端的文字的,可是在这个小问题上花了较长时间感觉很不值得,只能自我安慰贴一下算是经验值的提升吧。

 

参考:

http://www.trirand.com/jqgridwiki/doku.php?id=wiki:options

http://www.trirand.com/jqgridwiki/doku.php?id=wiki:change#jqgrid_3.5.2_changes_and_fixes

posted on   JeffWong  阅读(1665)  评论(0编辑  收藏  举报
编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
历史上的今天:
2009-09-25 发布一个简单小巧的ajax操作类
2009-09-25 发布一个简单实用的xml文件操作帮助类
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

I know how to make it works and I want to know how it works.
点击右上角即可分享
微信分享提示