毫无疑问,解决办法就是进行编码后提交
今天在做一个异步提交数据的时候,由于富文本编辑器产生了一些HTML代码,提交后台会出错。我测试了3种编码进行提交
顺带提一句,Asp.NET的Request取得的表单值,以及各种控件的Text属性,会自动对URL编码的数据进行解码,所以富文本编辑器在WebForm表单中提交不需要手动解码
1、第一个就是JS种window对象自带的encodeURIComponent函数,编码后提交,但是后台怎么解码呢。
就.NET而言,对应encodeURIComponent的解码是Server.UrlDecode
2、第二种,手写一个函数,动态创建一个div,把需要编码的字符串放进去,再取HTML出来,这就是HMTL编码
其对应的.NET解码为Server.HtmlDecode
function HTMLEncode(input) {
var converter = document.createElement("DIV");
converter.innerText = input;
var output = converter.innerHTML;
converter = null;
return output;
}
第三种其实还是window对象自带的encodeURI,用法与encodeURIComponent基本一致
不过这里有一点疑问,encodeURI和HMTL编码不会对一些符号编码,例如'=',所以原以为这样编码在get提交时会出问题,但是确实是正确提交了,还是对可靠性持怀疑态度?
以下是编码方式不被转换的字符:
encodeURI不编码字符有82个:!,#,$,&,',(,),*,+,,,-,.,/,:,;,=,?,@,_,~,0-9,a-z,A-Z
encodeURIComponent不编码字符有71个:!, ',(,),*,-,.,_,~,0-9,a-z,A-Z
今天又做了一下AJAX请求带有HTML标签的数据,发现后台Server.UrlDecode编码的数据传递到前台,encodeURIComponent,encodeURI都无法正确解码,encodeURIComponent还好,只是‘+’没有被还原为空格,encodeURI就更不理想了
对此找到了2个解决办法:
1、后台引用程序集 Microsoft.JScript, 对数据使用GlobalObject.escape函数编码,前台使用JS的unescape进行解码
2、后台仍然使用Server.UrlEecode,前台使用encodeURIComponent解码后进行字符串替换。当然这种方法是强烈不推荐的
。