web-dev-qa-db-fra.com

Comment utiliser HTMlenCode avec des champs de modèle, une liaison de données et une grille

J'ai une grille de grille liée à un objetDataSource. Je l'ai également soutenu, ce qui fonctionne bien. Cependant, je voudrais un texte HTMlenCode en toute sécurité affiché comme nous autorisons des caractères spéciaux dans certains champs. Ceci est un Cinch à voir avec des champs standard, car je viens de définir HTMlenCode sur True.

Mais afin de configurer des contrôles de validation, il faut plutôt utiliser des modèles. Comment puis-je facilement ajouter htmlencoding à la sortie de cette façon? Ceci est un projet ASP.NET 2.0, donc j'utilise les nouveaux raccourcis de liaison de données (par exemple Eval et Bind).

Ce que j'aimerais faire, c'est quelque chose comme ce qui suit:

<asp:TemplateField HeaderText="Description">
    <EditItemTemplate>
        <asp:TextBox ID="TextBoxDescription" runat="server"
                     Text='<%# System.Web.HttpUtility.HtmlEncode(Bind("Description")) %>'
                     ValidationGroup="EditItemGrid"
                     MaxLength="30" />
        <asp:Validator ... />
    </EditItemTemplate>
    <ItemTemplate>
        <asp:Label ID="LabelDescription" runat="server"
                   Text='<%# System.Web.HttpUtility.HtmlEncode(Eval("Description")) %>' />
    </ItemTemplate>
</asp:TemplateField>

Cependant, quand j'essaie de cette façon, j'obtiens l'erreur suivante:

CS0103: Le nom 'BIND' n'existe pas dans le contexte actuel

23
Sean Hanley

Ceci est maintenant possible de faire à l'aide de la nouvelle syntaxe de données de base de données de codage HTML introduite dans ASP.NET 4.

Vous pouvez simplement utiliser:

<%#: Eval("MyField") %>

Ou

<%#: Bind("MyField") %>

Notez le côlon après la livre/panneau de hasch C'est aussi simple que cela.

31
pattermeister

Devis de http://weblogs.asp.net/leftslipper/archive/2007/06/29/how-asp-net-Databinding-Deals-with-eval-and-bind-statifs.aspx

Il n'y a pas de méthode de liaison dans ASP.NET. Quand ASP.NET analyse votre fichier et voit que vous utilisez

[.____] Cela génère un code spécial pour cela. Lorsque vous utilisez, ce n'est pas un appel de fonction réel. Si ASP.NET analyse le code et détecte une instruction BIND (), il divise l'instruction en deux parties. La première partie est la partie de base de données à sens unique, qui finit par être juste un appel normal (). La deuxième partie est la partie inverse, qui est typiquement du code le long des lignes de "nom de chaîne = textbox1.text" qui saisit la valeur de l'endroit où elle était liée. Cependant, étant donné que ASP.NET doit analyser les déclarations BIND (), une base de données bidirectionnelle ne supporte rien d'autre que BIND (). Par exemple, la syntaxe suivante est invalide car elle essaie d'invoquer le code arbitraire et d'utiliser lié () en même temps: [.____]

Les seuls formats pris en charge dans une base de données bidirectionnelle sont liés ("champ") et lier ("champ", "format string {0}").

Vous pouvez utiliser EVAL au lieu de se lier dans votre EdiTeTemTemplate. Vous devez également vous lancer à String:

<asp:Label ID="LabelDescription" 
           runat="server" 
           Text='<%# System.Web.HttpUtility.HtmlEncode((string)Eval("Description")) %>' />
17
Darin Dimitrov

Comme déjà expliqué par Darin Dimitrov, vous ne pouvez pas utiliser Bind comme paramètre d'une fonction. Donc, Text='<%# System.Web.HttpUtility.HtmlEncode(Bind("Description")) %>' n'est pas possible. De l'autre côté, il n'est généralement pas nécessaire d'utiliser HTMlenCode ici car vous utiliserez Bind avec un contrôle permettant de modifier les données, par exemple avec une zone de texte (comme dans l'exemple de votre EDITEMTemplate). Mais une zone de texte code automatiquement, vous pouvez donc appeler en toute sécurité Bind sans avoir besoin de HTMLenCode:

<EditItemTemplate>
    <asp:TextBox ID="TextBoxDescription" runat="server"
                 Text='<%# Bind("Description") %>'
                 ValidationGroup="EditItemGrid"
                 MaxLength="30" />
    <asp:Validator ... />
</EditItemTemplate>

Si une zone de texte n'encosait pas automatiquement à l'aide de Bind _ serait un énorme trou de sécurité (sauf si vous êtes absolument sûr que vos données soient prudentes pour être rendues à HTML sans encodage).

Mais le codage automatique n'est pas le cas pour une étiquette par exemple. Bien que vous puissiez également utiliser Bind dans la propriété texto d'une étiquette, la sortie à l'étiquette n'est pas codée automatiquement - une raison pour laquelle utiliser Bind avec une étiquette n'est pas une bonne pratique, car Vous ne pouvez pas encoder le texte de l'étiquette avec Bind. Utilisez plutôt Eval et enveloppez-le dans HTMLenCode, comme vous l'avez fait dans votre optionTemplate: Text='<%# System.Web.HttpUtility.HtmlEncode((string)Eval("Description")) %>'

8
Slauma
<asp:TemplateField HeaderText="Description">     
  <EditItemTemplate>         
    <asp:TextBox ID="TextBoxDescription" runat="server" Text='<%# System.Web.HttpUtility.HtmlEncode(Bind("Description")) %>'                ValidationGroup="EditItemGrid"  MaxLength="30" />
     <asp:Validator ... />     
  </EditItemTemplate>     
  <ItemTemplate>         
     <asp:Label ID="LabelDescription" runat="server"  Text='<%# System.Web.HttpUtility.HtmlEncode(Convert.ToString(Eval("Description"))) %>' /> 
  </ItemTemplate> 
</asp:TemplateField> 
6
satya

Bind () est utilisé pour reliure de données bidirectionnelle , pour que cela fonctionne, vous devrez utiliser l'événement RowUpDatinat de la grilleView.

void GridView_RowUpdating(Object sender, GridViewUpdateEventArgs e)
{
    foreach (DictionaryEntry entry in e.NewValues)
    {
        e.NewValues[entry.Key] = System.Web.HttpUtility.HtmlEncode(entry.Value.ToString());
    }
}
2
Phaedrus

Dans mon cas, j'ai été obligé d'utiliser la méthode "Bind" sur Mi EdiTemtemplate's Textbox, car les données doivent être accessibles dans la matrice NewValues ​​à la manipulation de l'événement item_updant. J'ai donc compris comme suit:

sur mon éditemtemplate:

<EditItemTemplate>
     <asp:TextBox runat="server" Text='<%# Bind("field")%>' ID="TextBox112" OnPreRender="TextBox_PreRender_decode"></asp:TextBox>                                            
</EditItemTemplate> 

puis dans le code derrière:

protected void TextBox_PreRender_decode(object sender, EventArgs e)
{
    TextBox tb = (TextBox)sender;
    tb.Text = WebUtility.HtmlDecode(tb.Text);
}

Cette solution m'a permis de montrer correctement une donnée codée HTML pour toutes mes boîtes de texte et de pouvoir accéder à ces données de la matrice de NewValues ​​lorsque l'événement Item_updating tire.

Qu'en est-il d'une méthode d'extension simple?

public static string HtmlEncode(this string s)
    {            
        s = HttpUtility.HtmlEncode(s);
        return s;
    }

Vous pourriez alors simplement exécuter:

<asp:Label runat="server" Text=<%# ((string)Eval("MyStringField")).HtmlEncode() %> />
1
BlackjacketMack

Mais prenez soin de vous si vous utilisez le code suivant de Phadrus et vous avez une colonne de case à cocher!

void GridView_RowUpdating(Object sender, GridViewUpdateEventArgs e)
{
    foreach (DictionaryEntry entry in e.NewValues)
    {
        e.NewValues[entry.Key] = System.Web.HttpUtility.HtmlEncode(entry.Value.ToString());
    }
}

Parce que la fonction entry.Value.ToString() rendra le true de la case à cocher à true, puis vous ne pouvez pas l'enregistrer dans le champ de la base de données!

0
user285967