以前一篇文章是寫,JavaScript處理特殊字符拼接時截斷問題。最近在處理公司老軟件兼容性升級時碰到的一個相似的問題,此次是後臺拼接字符串,前臺.aspx頁面顯示的。中間走了兩次彎路,在此記錄一下。html
先看個正確的效果圖。ide
圖(1)這個圖看起來是否是有點眼熟ui
業務處理場景簡單化一下。在日期控件裏顯示拼接的html標籤。下面代碼是未處理這個bug時源代碼。編碼
1 StringBuilder strBld = new StringBuilder(); 2 CalendarDay day = e.Day; 3 TableCell tc = e.Cell; 4 5 if (day.IsOtherMonth) 6 { 7 8 tc.Controls.Clear(); 9 return; 10 } 11 e.Cell.Attributes.Remove("align"); 12 e.Cell.Attributes.Add("align", "left"); 13 e.Cell.CssClass = "date"; 14 15 strBld.AppendFormat("<dl><dt>"); 16 strBld.Append(day.Date.Day.ToString() + "日"); 17 strBld.Append("</dt>"); 18 DataRow[] drs = dsNote.Tables[0].Select(" createDate>'" + day.Date.ToString() + "' and createDate<'" + day.Date.AddDays(1).ToString() + "'"); 19 if (drs.Length > 0) 20 { 21 strBld.Append("<dd><ul>"); 22 int num = 0; 23 //得到數據 24 foreach (DataRow dr in drs) 25 { 26 if (num < 3) 27 { 28 strBld.AppendFormat("<li><img src='../images/main/manage_ico.gif' /><a onclick='opendlg({1})' nid='{1}' title='{2}'>{0}</a></li>", 29 Globals.GetSummary(dr["title"].ToString(), 5), 30 dr["noteID"].ToString(), dr["title"].ToString()); 31 } 32 else 33 { 34 strBld.AppendFormat("<li><a onclick='opendlg2(\"{0}\")'>更多....</a></li>", e.Day.Date.ToShortDateString()); 35 break; 36 } 37 num++; 38 } 39 strBld.Append("</ul></dd>"); 40 } 41 strBld.Append("</dl>"); 42 tc.Text = strBld.ToString();
拼接的字符串,「<a onclick='opendlg({1})' nid='{1}' title='{2}'>」 這種形式會在輸入特殊字符「'」單引號時截斷,致使後面的內容顯示錯誤。見下圖。spa
圖(2)3d
第一次解決思路(當時很天真:D):既然onclick裏的opendlg()有用,那我直接在title裏用上escapeHtml這個方法就是了。結果並沒什麼用。頁面直接顯示出來這個方法o(╯□╰)o。code
圖(3)orm
第二種思路是用Server.HtmlEncode()。代碼30行dr["title"].ToString()這個參數用Server.HtmlEncode()包起來,滿心期待的能奏效,結果仍是不行,且但願越大,失望越大,日曆表格整個都顯示不全了。htm
圖(4)blog
最後仍是html實體編碼的思路,只不過此次是換後臺執行。用兩個方法處理了下特殊字符。用HtmlEncode(string s)方法替代了Server.HtmlEncode(),解決問題。下面貼上代碼:
public string HtmlEncode(string s) { if (s == null) { return null; } StringBuilder sb = new StringBuilder(); StringWriter output = new StringWriter(sb); HtmlEncode(s, output); return sb.ToString(); } public void HtmlEncode(string s, TextWriter output) { if (s != null) { int length = s.Length; for (int i = 0; i < length; i++) { char ch = s[i]; char ch2 = ch; if (ch2 != '"') { switch (ch2) { case '<': output.Write("<"); continue; case '>': output.Write(">"); continue; case '\'': output.Write("'"); continue; case '&': output.Write("&"); continue; default: output.Write(ch); continue; } } else { output.Write("""); continue; } } } }
//html解碼 function htmlDecodeByRegExp(str) { var s = ""; if(str.length == 0) return ""; s = str.replace(/&/g,"&"); s = s.replace(/</g,"<"); s = s.replace(/>/g,">"); s = s.replace(/ /g," "); s = s.replace(/'/g,"\'"); s = s.replace(/"/g,"\""); return s; }