原因
在DataGrid的Cell上显示 HTML 编码后的字符串怎么做呢?如果还有恶意的代码!我想网页就会出乱子啦!
事例
例如我有一个DataGrid用来显数据库中的自定义表的数据表中含有用户名信息如果某人在输入了这样的信息
<script>alert(Hello);</script> 作为用户名当浏览含有这个DataGrid的页面时就会弹出一个消息框我们希望的是
在DataGrid的表格上显示我们输入的信息<script>alert(Hello);</script>而不是希望有什么恶意的东西发生
方法
我的解决办法就是用<asp:TemplateColum>替换所有的<asp:BoundColumn>下面是具体的办法
替换前
<asp:BoundColumn DataField=Name HeaderText=Name></asp:BoundColumn>
替换后:
<asp:TemplateColumn HeaderText=Name>
<ItemTemplate>
<%# GetCellEntry( DataBinderEval(Container DataItemName ) ) %>
</ItemTemplate>
</asp:TemplateColumn>
GetCellEntry是进行将字符串转换为 HTML 编码的字符串
protected string GetCellEntry( object o )
{
string text = oToString();
if ( text != null && textTrim() != stringEmpty )
return ServerHtmlEncode( text );
else
return ;
}
这样的方法让人感到很麻烦因为我不得不为每一个DataGrid重复一遍这样的工作于是有了下面的解决方法
很好的解决方法就是利用OnItemDataBound事件来解决这个问题可以在datagrid上设置OnItemDataBound
<asp:datagrid id=MyDataGrid runat=server OnItemDataBound=Item_DataBound></asp:datagrid>
代码可以这样写
private void DataGrid_ItemDataBound( object sender
SystemWebUIWebControlsDataGridItemEventArgs e )
{
for ( int i = ; i < DataGridColumnsCount; i++ )
{
if ( DataGridColumns[i]GetType() == typeof(
BoundColumn ) &&
( eItemItemType == ListItemTypeItem ||
eItemItemType == ListItemTypeAlternatingItem ) )
{
BoundColumn boundColumn = (BoundColumn)
DataGridColumns[i];
string text = DataBinderEval( eItemDataItem
boundColumnDataField boundColumnDataFormatString );
eItemCells[i]Text = ServerHtmlEncode( text );
}
}
}
结论
datagrid数据表格中的数据将会绑定两次数据源第一次是在控件自身绑定数据的时候第二次在触发ItemDataBound事件的时候也许这样做没有好的效率但这也是一种不错的将字符串转换为 HTML 编码的字符串的方法
希望在ASPNET的未来版本中含有HTMLEncode的选项用来处理将字符串转换为 HTML 编码的字符串在数据绑定时