是否有一种简单的方法来对formview中的几个绑定字段进行html解码?

时间:2015-06-30 23:58:50

标签: c# asp.net formview

友 在我的formview InsertTemplate中,我们有几个文本框。保存数据时,我们运行循环以在ItemInserting期间使用循环清理数据:

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附加到新文本框。 有没有办法在EDITTEMPLATE上使用HtmlDecode运行循环?

1 个答案:

答案 0 :(得分:0)

虽然,我会考虑做一个更清洁的解决方案。问题是文本框控件对已编码的HTML字符串进行编码。因此,要批量解码它们,您可以尝试这样的事情。

拥有这样的表格视图:

    <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; }
}