2015-06-30 21 views
0

朋友, 在我的formview InsertTemplate中,我們有幾個文本框。當數據被保存我們ItemInserting期間運行一個循環消毒使用循環的數據:有沒有一種簡單的方法來html解碼formview中的幾個綁定字段?

Server.HtmlEncode(e.Values[a].ToString()); 

因此,如

<script> alert('Hello, World!') </script> 

被轉換並保存爲

&lt;script&gt; alert('Hello, World!') &lt;/script&gt; 

的值我們在EDITTEMPLATE時向用戶顯示相同的值。這是通過啓動附加到EDITTEMPLATE中每個文本框的下面的代碼完成的。

OnDataBinding="DecodeTextBox_DataBinding" 

C#代碼:

((TextBox)sender).Text = HttpUtility.HtmlDecode(((TextBox)sender).Text); 

在這樣的EDITTEMPLATE文本框顯示究竟救什麼用戶,這就是:

<script> alert('Hello, World!') </script> 

問題是,開和關,我們必須爲每個客戶的需求添加額外的文本框 - 這樣的請求太多了。有時我們忘記將數據綁定HtmlDecode附加到新的文本框中。 有沒有辦法使用HtmlDecode在EDITTEMPLATE上運行循環?

+0

爲什麼不只是擴展文本框和覆蓋文本的getter/setter屬性? – DanielS

回答

0

雖然,我會考慮做一個更乾淨的解決方案。問題在於文本框控件對已經編碼的HTML字符串進行編碼。因此,要批量解碼它們,你可以嘗試這樣的事情。

有這樣的一個FormView:

<asp:FormView ID="myFormView" OnDataBound="myFormView_DataBound" DefaultMode="Edit" runat="server"> 
     <EditItemTemplate> 
      <asp:TextBox runat="server" ID="TextBox1" Text='<%# DataBinder.Eval(Container.DataItem,"ItemA") %>'></asp:TextBox> 
      <asp:TextBox runat="server" ID="TextBox2" Text='<%# DataBinder.Eval(Container.DataItem,"ItemB") %>'></asp:TextBox> 
     </EditItemTemplate> 
     <ItemTemplate> 
      <asp:Literal runat="server" ID="TextBox1" Text='<%# DataBinder.Eval(Container.DataItem,"ItemA") %>'></asp:Literal> 
      <asp:Literal runat="server" ID="TextBox2" Text='<%# DataBinder.Eval(Container.DataItem,"ItemB") %>'></asp:Literal> 
     </ItemTemplate> 
    </asp:FormView> 

你可以遞歸HtmlDecode它內部的所有文本框,數據綁定執行後:

public partial class _Default : Page 
{ 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     var data = new[]{ 
      new DataObject(){ 
       ItemA = "&lt;div&gt;Item 1&lt;/div&gt;", 
       ItemB = "&lt;div&gt;Item 2&lt;/div&gt;" 
      } 
     }; 

     myFormView.DataSource = data; 
     myFormView.DataBind(); 


    } 

    protected void myFormView_DataBound(object sender, EventArgs e) 
    { 
     var form = (FormView)sender;   
     HtmlDecode(form); 
    } 

    private void HtmlDecode(Control control) 
    { 
     if (control == null) 
      return; 

     foreach(var child in control.Controls.Cast<Control>()) 
      HtmlDecode(child); 

     var textBox = control as TextBox; 

     if (textBox == null) 
      return; 

     textBox.Text = HttpUtility.HtmlDecode(textBox.Text); 
    }  
} 

public class DataObject 
{ 
    public string ItemA { get; set; } 
    public string ItemB { get; set; } 
} 
相關問題