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 ...
随机推荐
- Linux系统IO分析工具之iotop常用参数介绍
Linux系统IO分析工具之iotop常用参数介绍 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 在一般运维工作中经常会遇到这么一个场景,服务器的IO负载很高(iostat中的 ...
- JAVA核心技术I---JAVA基础知识(二进制文件读写和zip文件读写)
一:二进制文件读写 (一)写文件 –先创建文件,写入数据,关闭文件 –FileOutputStream, BufferedOutputStream,DataOutputStream –DataOutp ...
- Idea构建maven项目
Idea构建maven项目: 步骤一: 步骤二: 自动导入Maven项目: 步骤三:增加web 二:搭建spring项目结构: 结构图: 网上都是一大堆的:自己也可以去搜:ssm pom.xml ...
- vertica系列:解锁table
Vertica 表发生死锁后, 通过下面3个查询即可解锁. --步骤1: 找到被锁表的 transaction_idselect transaction_id, t.* from v_monitor. ...
- Retrofit提交Json
1.APIService为自定义接口类, 定义@Headers @Headers({"Content-Type: application/json","Accept: a ...
- MobSF移动渗透测试框架
1.https://github.com/MobSF/Mobile-Security-Framework-MobSF/wiki/1.-Documentation 2.http://www.freebu ...
- 大规模数据导入和导出(mysql)
测试数据2.5G,共有数据9427567条.用的mysql的large服务器的配置.load 一次需要大概10分钟左右.建的表用的是MYISAM,调整了几个session的参数值 SET SESSIO ...
- [SYSS-2018-033]: Fujitsu Wireless Keyboard Set LX901 - Keystroke Injection Vulnerability
风险简介: [SYSS-2018-033]:富士通无线键盘组LX901 -击键注入漏洞 风险报告ID: sys - 2018 - 033 产品:无线键盘套件LX901 制造商:富士通 受影响版本:型号 ...
- luogu P3240 [HNOI2015]实验比较
传送门 首先根据题目条件,题目中如果是=的点可以缩起来,然后\(a<b\)连边\(a\rightarrow b\),而且所有点入度为最多1,那么判掉有环的不合法情况,题目中的依赖关系就是一颗外向 ...
- linux 添加并格式化新硬盘
linux挂载磁盘1. 格式化磁盘mkfs -t ext4 /dev/sdb2. 挂载mount /dev/xvdb /home3. 查看磁盘对应的uuidblkid4. 加入开机自动挂载,在/etc ...