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

 

题外话:以前常常看博客园或者其余人写的帖子、文章,好多人分享的文章写的很好,技术上认知是一方面,排版什么的也很好。事情放到本身时才以为,写一篇好的文字真是不容易,要很用心,有心再编辑、润色一下本身的博客,发现仍是不够满意,之后再慢慢积累吧,文章中可能有的地方说的不是很清楚,欢迎你们批评指正。
相关文章
相关标签/搜索