格式化ASP.Net Boundfield中的文本

时间:2010-08-09 22:40:37

标签: asp.net web-applications webforms

我在编辑窗口中有一个带有几个边界的webform,如下所示:

<asp:BoundField DataField="TS_TITLE" HeaderText="Title" SortExpression="TS_TITLE" HeaderStyle-VerticalAlign="Top" HtmlEncode="True" >
            <ControlStyle Width="500px" />
        </asp:BoundField>
        <custom:BoundTextBoxField DataField="TS_DESCRIPTION" HeaderText="Desription" HeaderStyle-VerticalAlign="Top" SortExpression="TS_DESCRIPTION"
            TextMode="MultiLine" Rows="20" Columns="100" Wrap="True" HtmlEncode="True"  />

我正在使用BoundField的Html Encode属性来防止跨站点脚本攻击。我想要做的是当用户重新打开编辑窗口时,我希望编码的html被解码和呈现,html标签和所有。我的问题是,当我尝试解码代码隐藏中的html时,在Page_Load函数下,当页面呈现给用户时它不会被设置,即它没有效果。以下是Page_Load:

的代码片段
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

        Dim dvrTest As DetailsViewRowCollection = DetailsView1.Rows

        Dim DescriptionTB As TextBox = dvrTest.Item(1).Cells(1).Controls(0)
        DescriptionTB.Text = HttpUtility.HtmlDecode(DescriptionTB.Text)
    End Sub 'Page_Load

调试时我可以看到html解码的文本应该看起来,我的猜测是在Page_Load退出后会发生一个额外的数据绑定,它会重置BoundTextBoxField。只是一个注释,我在BoundField和BoundTextBoxField上测试了它,两者的效果相同。

我在我的应用程序的另一部分使用的下拉列表中遇到了类似的问题,只有我在使用onLoad事件调用函数在页面加载和数据绑定后进行数据操作。不幸的是,Boundfield似乎没有那个事件,我发现最接近的是DataFormatString属性,但这在使用日期和货币时似乎很有用。

更新:

如果有人想知道,即使HTMLEncode属性设置为false,我也会在重新加载编辑窗口时获得编码文本。

更新2:

尝试覆盖OnDataBinding方法,但似乎没有做任何事情。

Protected Overrides Sub OnDataBinding(ByVal e As System.EventArgs)
        Me.OnDataBinding(e)
        Dim dvrTest As DetailsViewRowCollection = DetailsView1.Rows
        Dim DescriptionTB As TextBox = dvrTest.Item(1).Cells(1).Controls(0)
        DescriptionTB.Text = HttpUtility.HtmlDecode(DescriptionTB.Text)
    End Sub

1 个答案:

答案 0 :(得分:0)

知道了。由于我的boundfields被封装在DetailsView中,我使用DetailsView的onLoad事件来调用代码隐藏中的函数来解码Boundfields文本中的任何html

''' <summary>
''' Decodes any HTML formatted tags in the Title and Description Textboxes of the Edit Window
''' </summary>
''' <param name="sender"></param>
''' <param name="e"></param>
''' <remarks></remarks>
Protected Sub HTMLDecode(ByVal sender As Object, ByVal e As System.EventArgs)
    If Page.IsPostBack = False Then
        ''Grab the Title and Description text boxes from the RowCollection
        Dim dvrTest As DetailsViewRowCollection = DetailsView1.Rows
        Dim TitleTB As TextBox = dvrTest.Item(0).Cells(1).Controls(0)
        Dim DescriptionTB As TextBox = dvrTest.Item(1).Cells(1).Controls(0)
        ''Decode HTML tags that are in either text box
        DescriptionTB.Text = HttpUtility.HtmlDecode(DescriptionTB.Text)
        TitleTB.Text = HttpUtility.HtmlDecode(TitleTB.Text)
    End If
End Sub 'HTMLDecode

使用onLoad事件在DetailsView中调用它

<asp:DetailsView ID="DetailsView1" runat="server" Height="260px" Width="500px" AutoGenerateRows="False"
            DataKeyNames="TS_ID" DataSourceID="SqlDataSource2" EnableModelValidation="true"
            GridLines="Both" Font-Names="Arial" HorizontalAlign="Center" OnLoad="HTMLDecode" >

如果有更直接的选择,我会很高兴听到它们。