C#代碼處理前臺html標籤拼接

  以前一篇文章是寫,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("&lt;");
                                continue;
                            case '>':
                                output.Write("&gt;");
                                continue;
                            case '\'':
                                output.Write("&#39;");
                                continue;
                            case '&':
                                output.Write("&amp;");
                                continue;
                            default:
                                output.Write(ch);
                                continue;
                        }
                    }
                    else
                    {
                        output.Write("&quot;");
                        continue;
                    }
                }
            }
        }
View Code
在前臺要再調用下解碼方法,參考代碼:
 //html解碼
        function htmlDecodeByRegExp(str) {
                      var s = "";
                      if(str.length == 0) return "";
                      s = str.replace(/&amp;/g,"&");
                      s = s.replace(/&lt;/g,"<");
                     s = s.replace(/&gt;/g,">");
                      s = s.replace(/&nbsp;/g," ");
                      s = s.replace(/&#39;/g,"\'");
                      s = s.replace(/&quot;/g,"\"");
                      return s;  
                }
View Code

 

題外話:以前常常看博客園或者其餘人寫的帖子、文章,好多人分享的文章寫的很好,技術上認知是一方面,排版什麼的也很好。事情放到本身時才以爲,寫一篇好的文字真是不容易,要很用心,有心再編輯、潤色一下本身的博客,發現仍是不夠滿意,之後再慢慢積累吧,文章中可能有的地方說的不是很清楚,歡迎你們批評指正。
相關文章
相關標籤/搜索