2010-08-09 7 views
1

J'ai un formulaire en ligne avec aa quelques BoundFields dans une fenêtre d'édition comme suit:texte Mise en forme dans un ASP.Net BoundField

<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" /> 

J'utilise la propriété Html Encode du BoundField pour sécuriser contre cross attaques de script de site. Ce que je voudrais faire, c'est quand un utilisateur rouvre la fenêtre d'édition, je veux que le code HTML codé soit décodé et présenté, les balises html et tout. Mon problème est que lorsque j'essaie de décoder le code HTML dans le code-behind, sous la fonction Page_Load, il n'est pas défini lorsque la page est présentée à l'utilisateur, c'est-à-dire qu'il n'a aucun effet. Voici l'extrait de code du 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 

Lors du débogage, je peux voir la car il doit regarder le texte HTML décodé, je suppose qu'il ya un DataBind supplémentaire qui se produit après la sortie de Page_Load qui remet à zéro le BoundTextBoxField. Juste une note, j'ai testé cela sur BoundField et BoundTextBoxField et l'effet est le même sur les deux. J'ai eu un problème similaire avec une liste déroulante que j'utilise dans une autre partie de mon application, seulement là j'utilisais l'événement onLoad pour appeler une fonction pour manipuler des données après que la page ait été chargée et databound. Malheureusement, Boundfield ne semble pas avoir cet événement, la chose la plus proche que j'ai trouvée est la propriété DataFormatString, mais cela ne semble être utile que lorsqu'on travaille avec des dates et des devises.

MISE À JOUR:

Au cas où quelqu'un se demandait, même avec l'ensemble de la propriété HTMLEncode false, je reçois le texte codé lorsque la fenêtre d'édition est Reloaded.

MISE À JOUR 2:

Essayé redéfinissant la méthode OnDataBinding, mais cela ne semble pas faire quoi que ce soit.

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 

Répondre

0

Vous l'avez. Depuis mes BoundFields ont été enfermés dans un DetailsView, je l'événement onLoad du DetailsView pour appeler une fonction dans le code-behind pour décoder le langage HTML dans le texte de la BoundFields

''' <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 

et de l'appeler dans le DetailsView l'utilisation de l'événement onLoad

<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" > 

S'il y a d'autres alternatives plus simples, je serais heureux de les entendre.