选择显示字体大小

asp.net中用户输入文本的html解析办法

网页中用textbox让用户输入文本,然后存入数据库,再从数据库中读出显示在页面上。常常这样做会遇到不少问题,因为textbox实际上是一个windows组件,和网页显示标记如:<p>,<td>,<div>等,对字符的解析方法是不同的。比如前者的换行标记为“\r\n”,而后者为“<br>”。这就带来一个转换的问题。xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

    在做转换之前,先来考虑几个问题:

1、 textbox用“\r\n”来标记换行而网页中以“<br>”标记

2、 网页中连续的空格当做一个空格处理,比如“a b    c”将会显示“a b c

3、 用户输入特殊字符比如:“<,&,&nbsp;,&lt;”,这些都是网页中有特殊意义的字符,会被解析,而用户输入的目的当然是不希望被解析。

现在来解决这几个问题,有一种解决办法是在显示的时候仍然用textbox去显示,这样就不用做任何转换,只要把textbox.readonly设为true,这样在一定程度上能满足要求。但是往往为了网页的美观,这样做是不可取的。比较好的办法是去解析用户输入的字符串,可以做这样的转换:

第一步:

<      à&lt;

&      à&amp;

&nbsp;à&amp;nbsp;

……(此处的省略号后文有说明)

第二步:

      à&nbsp;

\r\n  à<br>

这里必须分两步转换,因为如果你先做第二步转换的话混把用户输入的特殊字符串和由转换而的的特殊字符串混淆,比如:

用户输入:a b   c&nbsp;d

第二步转换:a&nbsp;b&nbsp;&nbsp;&nbsp;c&nbsp;d

第一步转换:a&amp;nbsp;b&amp;nbsp;&amp;nbsp;&amp;nbsp;c&amp;nbsp;d

可以看到,经过第一次转换后已经无法分辨用户输入的“&nbsp;”和转换而来的“&nbsp;”,在做第二次转换的时候就会统一处理就会出错。结果显示:a&nbsp;b&nbsp;&nbsp;&nbsp;c&nbsp;d

如果严格按照第一步,第二步的转换顺序来转换就不会出现这个问题。

把转换后的字符串存入数据库,在显示的时候直接把从数据库读出的字符串给html组件赋值,比如:

//这里假设temp是从数据库中读出来的,这里演示tablehtmltable其他的控件类似

//显示的效果是:<a b

 

//table1web控件

string temp = “&lt;a&nbsp;b”;

table1.rows[0].cells[0].text = temp;

//table2html控件

table2.rows[0].cells[0].innerhtml = temp;

htmltable有两个相似的属性“innerhtml,innertext”,介绍一下这两个属性的区别:

innerhtml:显示的时候会对传入的值进行html解析,就像上面的例子。

xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" />innertext:显示的时候不会对传入的值新型解析,直接把传入的值显示出来。比如把上面的例子改成:table2.rows[0].cells[0].innertext = temp;那么显示的效果将会变成:&lt;a&nbsp;b

虽然这两个属性用起来很方便,似乎可以满足平时的使用需求,但是innertext有两个问题:

1、 无法标记换行,不管是“\r\n”还是“<br>”都不是换行标记

2、 连续的空格仍然只显示一个空格。

所以想不转换字符串而直接用innertext是不可取的。但是转换是个非常繁琐的过程,因为html的特殊标记非常多。值得庆幸的是asp.net提供了httpserverutil类,该类提供了htmlencode()htmldecode()方法,这里我们只用到htmlencode()方法。我们就可以这样来转换:

//\r\n”在textbox中硬回车的时候会自动添上

string temp = “a b   c&nbsp;d\r\ne<”;

//serverpage类的一个属性,也就是说任何aspx页面的codebehind中都是可以使用的

//因为aspx页面都是继承page类的。

temp = server.htmlencode(temp);

temp = temp.replace(" ","&nbsp;");

temp = temp.replace("\r\n","<br>");

table1.rows[0].cells[0].text = temp;

table2.rows[0].cells[0].innerhtml = temp;

//显示效果:a b   c&nbsp;d

//        e<

到这里你也许会想一个问题,万一用户输入“\r\n”怎么办?不用担心,网页组件的设计者已经考虑到了这个问题,因为用户输入的“\r\n”会被自动转换成“\\r\\n”。

 


 


关键字 本文所属关键字

相关 与本文相关文章

分类 所有文章关键字导航

源码编程相关

Java   Asp   PHP   .Net   XML   C/C++   CGI   VB   Jsp   J2ee   J2se   J2me   EJB   Servlet   Tomcat   Resin   Struts   Weblogic   Eclipse   ANT   GUI   JMS   Web servise   IDEA   Webphere   Hibernate   Spring   Jboss   Applet   Swing   Socket   Javamail   Perl   Ajax   P2P   安全   模式   框架   测试   开源   游戏

SQL数据库相关

My-SQL   Ms-SQL   Access   DB2   Oracle   Sybase   SQLserver   索引   存储过程   加密   数据库   分页   视图  

手机无线相关

3G   Wap   CDMA   GRPS   GSM   IVR   彩信   短信   无线   增值业务

网页设计制作相关

HTML   CSS   网页配色   网页特效   Javascript   VBscript   Dreamweaver   Frontpage   JS   Web   网站设计

网站建设推广相关

建站经验   网站优化   网站排名   推广   Alexa

操作系统/服务器相关

Windows XP   Windows 2000   Windows 2003   Windows Me   Windows 9.x   Linux   UNIX   注册表   操作系统   服务器   应用服务器

图形图像多媒体相关

Photoshop   Fireworks   Flash   Coreldraw   Illustrator   Freehand   Photoimpact   多媒体   图形图像

标准 网站致力的规范

Valid CSS!

无不良内容,无不良广告,无恶意代码

Valid XHTML 1.0 Transitional

creativecommons