解決AJAX向後臺傳送HMTL程式碼失敗的問題
毫無疑問,解決辦法就是進行編碼後提交
今天在做一個非同步提交資料的時候,由於富文字編輯器產生了一些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,
對此找到了2個解決辦法:
1、後臺引用程式集 Microsoft.JScript, 對資料使用GlobalObject.escape函式編碼,前臺使用JS的unescape進行解碼
2、後臺仍然使用Server.UrlEecode,前臺使用encodeURIComponent解碼後進行字串替換。當然這種方法是強烈不推薦的
。