我在编辑窗口中有一个带有几个边界的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
答案 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" >
如果有更直接的选择,我会很高兴听到它们。