標籤:
前段時間做一個項目,需要處理輸入的特殊字元的問題。所謂特殊字元,主要指除字母、數字、漢字等之外的一些符號,項目的要求是不管使用者輸入什麼字元,都可以在介面上原樣顯示出來。我們知道javascript有符號的編碼和解碼方法:escape和unescape,而c#其實也有對應的方法Microsoft.JScript.GlobalObject.escape和Microsoft.JScript.GlobalObject.unescape。那具體怎樣使用呢?
1.ajax方式從後台取資料到前端轉換成json格式,c#代碼要對特殊字元串進行編碼,否則前端可能無法轉換成json格式的資料。
比如字串中包含雙引號、逗號、冒號等跟json格式衝突的符號時,如果不進行轉換,json轉換時會報錯。此時c#代碼需要調用Microsoft.JScript.GlobalObject.escape(string str)方法將該字串進行編碼後組織成json字串response到前端,前端ajax接收到該字串時需要調用javascript的unescape(str)方法進行解碼後再使用。當然首先需要添加Microsoft.JScript的引用。
例:
定義字串
string str = "...,:";
StringBuilder builder = new StringBuilder();
不轉換輸出
builder.Append("{");
builder.AppendFormat("\"content\":\"{0}\"", str);
builder.Append("}");
context.Response.Write(builder.ToString());
ajax端代碼:
$.ajax({
url: "Hander.ashx",
dataType: "json",
type: "get",
data: { method: "getName" },
beforeSend: function () {
},
success: function (data, textStatus){
if(data){
//前端採用unesacpe轉換需要的資料。
var name=unescape(data.name);
//......
}
},
error: function (XMLHttpRequest, textStatus, errorThrown){
}
c#端代碼不轉換時ajax的error方法會執行,可以取得錯誤資訊。
而c#代碼轉換其實很簡單,只需要將上面的builder.AppendFormat("\"content\":\"{0}\"", str)換成builder.AppendFormat("\"content\":\"{0}\"", Microsoft.JScript.GlobalObject.escape(str))即可。
2.ajax方式從前端傳資料給後端。需要將特殊字元進行escape編碼,否則通過get方式傳遞資料時如果有?、&、=等字元就會出現異常,因為這幾個字元是get方式的url的參數串連符。
var name="?%&=" ;
$.ajax({
url: "Hander.ashx",
dataType: "json",
type: "get",
data: { method: "setName",name:name},
beforeSend: function () {
},
success: function (data, textStatus){
}
此時需要對name進行escape編碼再傳遞給後台,name=escape(name)。
c#端接收的時候就很簡單了,調用Microsoft.JScript.GlobalObject.unescape(context.Request[name])即可。
說了這麼多,其實就是一句話的事,javascript的unescape和escape對應c#的Microsoft.JScript.GlobalObject.unescape和Microsoft.JScript.GlobalObject.escape方法。自己根據需要調用就是了。
c#和javascript特殊字元的前後端轉換