之前一篇文章是写,JavaScript处理特殊字符拼接时截断问题。最近在处理公司老软件兼容性升级时碰到的一个类似的问题,这次是后台拼接字符串,前台.aspx页面显示的。中间走了两次弯路,在此记录一下。

先看个正确的效果图。

图(1)这个图看起来是不是有点眼熟

业务处理场景简单化一下。在日期控件里显示拼接的html标签。下面代码是未处理这个bug时源代码。

         StringBuilder strBld = new StringBuilder();
CalendarDay day = e.Day;
TableCell tc = e.Cell; if (day.IsOtherMonth)
{ tc.Controls.Clear();
return;
}
e.Cell.Attributes.Remove("align");
e.Cell.Attributes.Add("align", "left");
e.Cell.CssClass = "date"; strBld.AppendFormat("<dl><dt>");
strBld.Append(day.Date.Day.ToString() + "日");
strBld.Append("</dt>");
DataRow[] drs = dsNote.Tables[].Select(" createDate>'" + day.Date.ToString() + "' and createDate<'" + day.Date.AddDays().ToString() + "'");
if (drs.Length > )
{
strBld.Append("<dd><ul>");
int num = ;
//获得数据
foreach (DataRow dr in drs)
{
if (num < )
{
strBld.AppendFormat("<li><img src='../images/main/manage_ico.gif' /><a onclick='opendlg({1})' nid='{1}' title='{2}'>{0}</a></li>",
Globals.GetSummary(dr["title"].ToString(), ),
dr["noteID"].ToString(), dr["title"].ToString());
}
else
{
strBld.AppendFormat("<li><a onclick='opendlg2(\"{0}\")'>更多....</a></li>", e.Day.Date.ToShortDateString());
break;
}
num++;
}
strBld.Append("</ul></dd>");
}
strBld.Append("</dl>");
tc.Text = strBld.ToString();

  拼接的字符串,“<a onclick='opendlg({1})' nid='{1}' title='{2}'>” 这种形式会在输入特殊字符“'”单引号时截断,导致后面的内容显示错误。见下图。

图(2)

  第一次解决思路(当时很天真:D):既然onclick里的opendlg()有用,那我直接在title里用上escapeHtml这个方法就是了。结果并没什么用。页面直接显示出来这个方法o(╯□╰)o。

图(3)

  第二种思路是用Server.HtmlEncode()。代码30行dr["title"].ToString()这个参数用Server.HtmlEncode()包起来,满心期待的能奏效,结果还是不行,且希望越大,失望越大,日历表格整个都显示不全了。

图(4)

  最后还是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 = ; 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("'");
continue;
case '&':
output.Write("&amp;");
continue;
default:
output.Write(ch);
continue;
}
}
else
{
output.Write("&quot;");
continue;
}
}
}
}
在前台要再调用下解码方法,参考代码:
 //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(/'/g,"\'");
s = s.replace(/&quot;/g,"\"");
return s;
}
题外话:之前经常看博客园或者其他人写的帖子、文章,好多人分享的文章写的很好,技术上认知是一方面,排版什么的也很好。事情放到自己时才觉得,写一篇好的文字真是不容易,要很用心,有心再编辑、润色一下自己的博客,发现还是不够满意,以后再慢慢积累吧,文章中可能有的地方说的不是很清楚,欢迎大家批评指正。

C#代码处理前台html标签拼接的更多相关文章

  1. Asp.Net_后台代码访问前台html标签

    //单击按钮后批量改变li元素的内联文本值及样式 ; i <= ; i++) { HtmlGenericControl li = this.FindControl("li" ...

  2. asp.net通过后台代码给前台设置css样式,下拉列表在js中的取值

    后台根据不同的用户登陆隐藏或显示前台div标签 前台: 将div声明成服务器端控件 <div id="div1" runat="server">.. ...

  3. 后台给前台传JSON字符串,前台解析并拼接显示

    后台传JSON public class CourseType : IHttpHandler { Epoint.PeiXun.Bizlogic.BLL.CourseLibrary.PX_CourseT ...

  4. 为何你的php代码没有写结束标签

    PHP闭合标签"?>"在PHP中对PHP的分析器是可选的.但是,如果使用闭合标签,任何由开发者,用户, 或者FTP应用程序插入闭合标签后面的空格都有可能会引起多余的输出.ph ...

  5. 如何一行jquery代码写出tab标签页(链式操作)

    啦啦!今天又学了一招,js写几十行的tab标签页jquery写一行就行啦,用到了链式操作!以下是代码: <!DOCTYPE html> <html lang="en&quo ...

  6. C#后台找不到前台html标签

    没关系!   只要他在form表单里  , 咱在标签加上一个   runat="server"就可以在后台cs代码里找到他了

  7. Android在代码中获取meta标签内容

    最近写SDK需要获取<meta>标签的值,网上资料很多~分享是件好事~我很快就找到了相关资料. 下面贴上代码: ApplicationInfo appInfo = null; String ...

  8. 如何在 js 代码中使用 jsp 标签或 Java 代码

    JSP 标签还是很方便的,比如 Struts.Spring 等提供给我们的 JSP 标签,可以用它们来获取变量或进行一些计算.比如 struts2 的 <s:url value="/a ...

  9. jeecms栏目模型和内容模型的使用以及对应前台的标签中的属性名

    第一步:模型管理-添加模型: 栏目模板前缀设定方案下的channel目录下的ch_menu.html作为浏览栏目的模板页.对应访问网址:项目名/栏目名(一级或者二级栏目如news或者gnxw)/ind ...

随机推荐

  1. Kafka权威指南 读书笔记之(五)深入Kafka

    集中讨论以下3 个有意思的话题 :• Kafka 如何进行复制:• Kafka 如何处理来自生产者和消费者的请求 :• Kafka 的存储细节,比如文件格式和索引. 集群成员关系 Kafka 使用 Z ...

  2. android 与html交互java调js与js调java操作

    1.首先在项目下建一个assets目录(右击app->New->Folder->Assets Flolder),直接放在项目根目录下和res目录同级别(把所html,js,图片,cs ...

  3. Eclipse 中报错的阅读顺序

    1 九月 19, 2018 8:49:53 上午 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefin ...

  4. html页面导出为excel表格

    <!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title>& ...

  5. Openresty 学习笔记(三)扩展库之neturl

    github地址:https://github.com/golgote/neturl 最近在搞一个视频加密播放,中间使用要用lua 匹配一个域名,判断该域名是否正确 PS:使用PHP很好做,lua 的 ...

  6. 设置 Visual Studio IIS Express 站点局域网访问

    Ø  Visual Stuido 的 IIS Express运行一个网站时,默认地址是这样的:http://localhost:23167/Cache/Three,其中 localhost 表示本机, ...

  7. IT这条路,适合什么人走。

    今天 ,到图书馆Study,呼,不知道为撒,看到那么多新书,那么多新技术(也不能说是新技术,就是自己没有学习过的技术),特别兴奋,学习的疲劳顿时间就没了,感觉什么都想学,都想据为己有,但是...... ...

  8. [译]MediatR, FluentValidation, and Ninject using Decorators

    原文 CQRS 我是CQRS模式的粉丝.对我来说CQRS能让我有更优雅的实现.它同样也有一些缺点:通常需要更多的类,workflow不总是清晰的. MediatR MediatR的文档非常不错,在这就 ...

  9. bus实现兄弟组件传值

    传递的地方:两个组件都要引入这个公共的bus中转函数 Bus.js文件相当于一个公共的对象: 传递的文件中写入这个方法: 兄弟组件通过点击事件输出参数,需要的组件来接收传递过来的参数:

  10. L - Tic-Tac-Toe FZU - 2283 (思维)

    题目链接: L - Tic-Tac-Toe FZU - 2283 题目大意:两个人下棋,一共是三步棋,第一个人下一步,第二个人下一步,第三个人下一步,然后问你在两个人在都足够聪明的条件下,第一个人能否 ...