熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java核心技術 >> 正文

DataGrid表格上字符串的HTML編碼詳解

2013-11-23 19:08:11  來源: Java核心技術 

  原因
  在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 編碼的字符串在數據綁定時
From:http://tw.wingwit.com/Article/program/Java/hx/201311/26341.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.