原因: 在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( DataBinder.Eval(Container, "DataItem.Name" ) ) %> </ItemTemplate> </asp:TemplateColumn> GetCellEntry是进行将字符串转换为 HTML 编码的字符串 protected string GetCellEntry( object o ) { string text = o.ToString(); if ( text != null && text.Trim() != string.Empty ) return Server.HtmlEncode( text ); else return " "; } 这样的方法让人感到很麻烦,因为我不得不为每一个DataGrid重复一遍这样的工作,于是有了下面的解决方法: 很好的解决方法就是利用OnItemDataBound事件来解决这个问题,可以在datagrid上设置OnItemDataBound <asp:datagrid id="MyDataGrid" runat="server" OnItemDataBound="Item_DataBound"></asp:datagrid> 代码可以这样写: private void DataGrid1_ItemDataBound( object sender, System.Web.UI.WebControls.DataGridItemEventArgs e ) { for ( int i = 0; i < DataGrid1.Columns.Count; i++ ) { if ( DataGrid1.Columns[i].GetType() == typeof( BoundColumn ) && ( e.Item.ItemType == ListItemType.Item e.Item.ItemType == ListItemType.AlternatingItem ) ) { BoundColumn boundColumn = (BoundColumn) DataGrid1.Columns[i]; string text = DataBinder.Eval( e.Item.DataItem, boundColumn.DataField, boundColumn.DataFormatString ); e.Item.Cells[i].Text = Server.HtmlEncode( text ); } } } 结论: datagrid数据表格中的数据将会绑定两次数据源,第一次是在控件自身绑定数据的时候,第二次在触发ItemDataBound事件的时候,也许这样做没有好的效率.但这也是一种不错的将字符串转换为 HTML 编码的字符串的方法。 希望在Asp.Net的未来版本中含有"HTML-Encode"的选项,用来处理将字符串转换为 HTML 编码的字符串在数据绑定时.
|