web-dev-qa-db-fra.com

Empêcher le codage HTML dans les colonnes GridView générées automatiquement

J'ai un GridView lié à un DataTable que je construis. La plupart des colonnes de la table contiennent le code HTML brut pour un lien hypelink. J'aimerais que ce code soit rendu sous forme de lien dans le navigateur, mais GridView code automatiquement le code HTML et le restitue sous forme de balisage.

Comment puis-je éviter cela sans ajouter explicitement HyperLink ou toute autre colonne?

18
ProfK

Définissez simplement la propriété BoundColumn.HtmlEncode sur false:

<asp:BoundField DataField="HtmlLink" HtmlEncode="false" />


Je crains qu’il n’existe pas de moyen simple de désactiver le codage HTML du contenu d’une variable GridView avec AutoGenerateColumns= true. Cependant, je peux penser à deux solutions de contournement qui pourraient résoudre le problème auquel vous êtes confronté:

Option 1: Héritez de la classe GridView, substituez la méthode Render, parcourez toutes les cellules, décodez leur contenu avant d'exécuter la méthode de base:

for (int i = 0; i < Rows.Count; i++) 
{
    for (int j = 0; j < Rows[i].Cells.Count; j++) 
    {
        string encoded = Rows[i].Cells[j].Text;
        Rows[i].Cells[j].Text = Context.Server.HtmlDecode(encoded);
    }
}

Option 2: Dans une classe héritant de GridView ou de la Page ou Control l'utilisant, faites votre propre inspection de la DataTable et créez une BoundColumn explicite pour chaque colonne:

foreach (DataColumn column in dataTable.Columns)
{
    GridViewColumn boundColumn = new BoundColumn
        {
            DataSource = column.ColumnName,
            HeaderText = column.ColumnName,
            HtmlEncode = false
        };
    gridView.Columns.Add(boundColumn);
}
26
Jørn Schou-Rode

J'ai pu y parvenir en utilisant la solution fournie par Jørn Schou-Rode, j'ai modifié un peu pour que cela fonctionne à partir de l'événement RowDataBound de mon Gridview.

protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.DataRow)
    {
           for (int j = 0; j < e.Row.Cells.Count; j++) 
           {
               string encoded = e.Row.Cells[j].Text;
               e.Row.Cells[j].Text = Context.Server.HtmlDecode(encoded);
           }

    }
}
9
Cesar Duran

Une autre méthode consiste à ajouter le suivant au gestionnaire d’événements RowDataBound ...

    If e.Row.RowType = DataControlRowType.Header Then
        For Each col As TableCell In e.Row.Cells
            Dim encoded As String = col.Text
            col.Text = Context.Server.HtmlDecode(encoded)
        Next
    End If
7
JMS

Utilisez OnRowCreated

    protected void gvFm_RowCreated(object sender, GridViewRowEventArgs e)
    {
        foreach (TableCell cell in e.Row.Cells)
        {
            BoundField fldRef = (BoundField)((DataControlFieldCell)cell).ContainingField;
            switch (fldRef.DataField)
            {
                case "ColToHide":
                    fldRef.Visible = false;                        
                    break;
                case "ColWithoutEncode":
                    fldRef.HtmlEncode = false;                        
                    break;
            }
        }
    }
2
R0man

Puisque toutes les réponses semblent être en C # et que les questions n'étaient pas spécifiques, j'ai rencontré ce problème en utilisant ASP.Net et VB.Net et la solution acceptée ne fonctionnait pas pour moi dans VB (bien que j'imagine ça marche en C #). J'espère que cela aidera tous ceux qui travaillent avec VB.Net dans ASP et qui tombent par hasard là-dessus.

Dans VB.Net, BoundColumn ne peut pas être ajouté à Gridview.Columns car ce n’est pas un System.Web.UI.WebControls.DataControlField; vous devez donc utiliser une BoundField qui est une DataControlField.

BoundColoumn n'a pas non plus de propriété HtmlEncode cependant BoundField en a. De plus, dans VB.Net, DataSource devient DataField.

        For Each dataCol As DataColumn In dv.Table.Columns
            Dim boundCol As New BoundField With {
                .DataField = dataCol.ColumnName,
                .HeaderText = dataCol.ColumnName,
                .HtmlEncode = False
            }

            gvResult.Columns.Add(boundCol)
        Next

        gvResult.DataSource = dv
        gvResult.Databind()

Notez également que vous devez définir explicitement AutoGenerateColumns="False" ou le GridView générera toujours des colonnes avec les colonnes ajoutées ci-dessus.

1
DavidScherer

Eh bien, puisque le code HTML pour le lien se trouve déjà dans votre base de données, vous pouvez simplement exporter le code HTML dans un contrôle littéral.

<asp:TemplateField HeaderText="myLink" SortExpression="myLink">
    <ItemTemplate>
        <asp:Literal ID="litHyperLink" runat="server" Text='<%# Bind("myLink", "{0}") %>' />
    </ItemTemplate>
</asp:TemplateField>

Cela devrait rendre votre lien en tant que texte brut permettant au navigateur de le rendre comme le lien que vous attendez.

1
Joel Etherton

Vous pouvez utiliser ce code dans l'événement RowDataBound si vous souhaitez désactiver le codage HTML dans toutes les lignes et toutes les colonnes.

protected void GV_Product_RowDataBound(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.DataRow)
    {
        foreach (TableCell ObjTC in e.Row.Cells)
        {
            string decodedText = HttpUtility.HtmlDecode(ObjTC.Text);
            ObjTC.Text = decodedText;
        }
    }
}
0
Manish Nayak