将DataGrid表格上字符串的HTML编码进行到底!

博客围绕DataGrid表格上字符串的HTML编码展开。因在DataGrid的Cell上显示HTML编码后的字符串可能存在恶意代码风险,给出两种解决办法,一是用<asp:TemplateColum>替换<asp:BoundColumn>,二是利用OnItemDataBound事件。虽绑定两次数据源效率不高,但也是可行方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

                          DataGrid表格上字符串的HTML编码

原因:
在DataGrid的Cell上显示 HTML 编码后的字符串,怎么做呢?如果还有恶意的代码!我想网页就会出乱子啦!

事例:

例如:我有一个DataGrid,用来显数据库中的自定义表的数据,表中含有用户名信息,如果某人在输入了这样的信息
"<script>alert('Hello');</script>" 作为用户名,当浏览含有这个DataGrid的页面时就会弹出一个消息框。我们希望的是
在DataGrid的表格上显示我们输入的信息"<script>alert('Hello');</script>",而不是希望有什么恶意的东西发生。
 
方法:

我的解决办法就是用<asp:TemplateColum>替换所有的<asp:BoundColumn>,下面是具体的办法。

替换前:

None.gif<asp:BoundColumn DataField="Name" HeaderText="Name"></asp:BoundColumn> 

替换后

None.gif<asp:TemplateColumn HeaderText="Name">
None.gif
<ItemTemplate>
   <%# GetCellEntry( DataBinder.Eval(Container, "DataItem.Name" ) ) %>
None.gif
</ItemTemplate>
None.gif
</asp:TemplateColumn>

 GetCellEntry是进行将字符串转换为 HTML 编码的字符串

None.gifprotected string GetCellEntry( object o )
ExpandedBlockStart.gif
{
InBlock.gif
string text = o.ToString();
InBlock.gif
if ( text != null && text.Trim() != string.Empty )
InBlock.gif
return Server.HtmlEncode( text );
InBlock.gif
else
InBlock.gif
return " ";
ExpandedBlockEnd.gif}

这样的方法让人感到很麻烦,因为我不得不为每一个DataGrid重复一遍这样的工作,于是有了下面的解决方法:

很好的解决方法就是利用OnItemDataBound事件来解决这个问题,可以在datagrid上设置OnItemDataBound

None.gif<asp:datagrid id="MyDataGrid" runat="server" OnItemDataBound="Item_DataBound"></asp:datagrid>

  代码可以这样写:

None.gifprivate void DataGrid1_ItemDataBound( object sender,
None.gifSystem.Web.UI.WebControls.DataGridItemEventArgs e )
ExpandedBlockStart.gifContractedBlock.gif
dot.gif{
InBlock.gif
for ( int i = 0; i < DataGrid1.Columns.Count; i++ )
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.gif
if ( DataGrid1.Columns[i].GetType() == typeof(
InBlock.gifBoundColumn ) 
&&
InBlock.gif( e.Item.ItemType 
== ListItemType.Item ||
InBlock.gife.Item.ItemType 
== ListItemType.AlternatingItem ) )
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.gifBoundColumn boundColumn 
= (BoundColumn)
InBlock.gifDataGrid1.Columns[i];
InBlock.gif
string text = DataBinder.Eval( e.Item.DataItem,
InBlock.gifboundColumn.DataField, boundColumn.DataFormatString );
InBlock.gife.Item.Cells[i].Text 
= Server.HtmlEncode( text );
ExpandedSubBlockEnd.gif}

ExpandedSubBlockEnd.gif}

ExpandedBlockEnd.gif}
 None.gif


结论:
datagrid数据表格中的数据将会绑定两次数据源,第一次是在控件自身绑定数据的时候,第二次在触发ItemDataBound
事件的时候,也许这样做没有好的效率.但这也是一种不错的将字符串转换为 HTML 编码的字符串的方法。
希望在ASP.NET的未来版本中含有"HTML-Encode"的选项,用来处理将字符串转换为 HTML 编码的字符串在数据绑定时.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值