C#代码处理前台html标签拼接
之前一篇文章是写,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("<");
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;
}
C#代码处理前台html标签拼接的更多相关文章
- Asp.Net_后台代码访问前台html标签
//单击按钮后批量改变li元素的内联文本值及样式 ; i <= ; i++) { HtmlGenericControl li = this.FindControl("li" ...
- asp.net通过后台代码给前台设置css样式,下拉列表在js中的取值
后台根据不同的用户登陆隐藏或显示前台div标签 前台: 将div声明成服务器端控件 <div id="div1" runat="server">.. ...
- 后台给前台传JSON字符串,前台解析并拼接显示
后台传JSON public class CourseType : IHttpHandler { Epoint.PeiXun.Bizlogic.BLL.CourseLibrary.PX_CourseT ...
- 为何你的php代码没有写结束标签
PHP闭合标签"?>"在PHP中对PHP的分析器是可选的.但是,如果使用闭合标签,任何由开发者,用户, 或者FTP应用程序插入闭合标签后面的空格都有可能会引起多余的输出.ph ...
- 如何一行jquery代码写出tab标签页(链式操作)
啦啦!今天又学了一招,js写几十行的tab标签页jquery写一行就行啦,用到了链式操作!以下是代码: <!DOCTYPE html> <html lang="en&quo ...
- C#后台找不到前台html标签
没关系! 只要他在form表单里 , 咱在标签加上一个 runat="server"就可以在后台cs代码里找到他了
- Android在代码中获取meta标签内容
最近写SDK需要获取<meta>标签的值,网上资料很多~分享是件好事~我很快就找到了相关资料. 下面贴上代码: ApplicationInfo appInfo = null; String ...
- 如何在 js 代码中使用 jsp 标签或 Java 代码
JSP 标签还是很方便的,比如 Struts.Spring 等提供给我们的 JSP 标签,可以用它们来获取变量或进行一些计算.比如 struts2 的 <s:url value="/a ...
- jeecms栏目模型和内容模型的使用以及对应前台的标签中的属性名
第一步:模型管理-添加模型: 栏目模板前缀设定方案下的channel目录下的ch_menu.html作为浏览栏目的模板页.对应访问网址:项目名/栏目名(一级或者二级栏目如news或者gnxw)/ind ...
随机推荐
- SQL语法基础之DELETE语句
SQL语法基础之DELETE语句 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.查看帮助信息 1>.查看DELETE的帮助信息 mysql> ? DELETE Na ...
- MapReduce-提交job源码分析
MapReduce-提交job源码分析 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.环境准备 1>.顺手的IDE,大家可以根据自己的喜好选择你喜欢的IDE 博主推荐以下 ...
- Kafka技术内幕 读书笔记之(六) 存储层——日志的读写
-Kafka是一个分布式的( distributed ).分区的( partitioned ).复制的( replicated )提交日志( commitlog )服务 . “分布式”是所有分布式系统 ...
- C#设计模式(5)——建造者模式
1.建造者模式介绍 在软件开发中,有时我们要创建一个复杂的对象,这个对象由几个子部件按一定的步骤组合而成,这时候我们就可以使用建造者模式了.说到建造者我们首先想到的是盖房子,盖房子简单的说有三个步骤: ...
- Ado.NET基础必备
一.SqlConnection对象 第一次需要连接数据库时要和服务器握手,解析连接字符串,授权,约束的检查等等操作,而物理连接建立后,这些操作就不会去做了(默认使用了连接池技术). SqlConnec ...
- ACM-ICPC 2018 南京赛区网络预赛 E AC Challenge(状压dp)
https://nanti.jisuanke.com/t/30994 题意 给你n个题目,对于每个题目,在做这个题目之前,规定了必须先做哪几个题目,第t个做的题目i得分是t×ai+bi问最终的最大得分 ...
- java中数组、集合、字符串之间的转换,以及用加强for循环遍历
java中数组.集合.字符串之间的转换,以及用加强for循环遍历: @Test public void testDemo5() { ArrayList<String> list = new ...
- Mac Office 2016 破解
官方最新版本office 是2016.15.38 此版本主要是修复了Excel内存损害漏洞. 官方下载的版本大小是1.67G,因为其他途径下载的版本,不确保是最新版本且为完整的版本.不知道我说的这个大 ...
- JS创建对象之构造函数模式
function Person(name, age, job) { this.name = name; this.age = age; this.job = job; this.sayName = f ...
- 数据库设计理论与实践·<五>常见疑难杂症