2010-01-30 17 views
13

Tengo un GridView vinculado a una DataTable que construyo. La mayoría de las columnas de la tabla contienen el HTML sin procesar para un hypelinklink, y me gustaría que ese HTML se represente como un enlace en el navegador, pero GridView está codificando automáticamente el HTML, por lo que se representa como marcado.Prevenir la codificación HTML en columnas GridView generadas automáticamente

¿Cómo puedo evitar esto sin agregar explícitamente HyperLink, o cualquier otra columna?

Respuesta

22

Basta con establecer la propiedad BoundColumn.HtmlEncode false:

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


Me temo que no hay una manera fácil de desactivar la codificación HTML de los contenidos en un GridView con AutoGenerateColumns= true . Sin embargo, no puedo pensar en dos soluciones que puedan resolver el problema que se enfrentan:

Opción 1: heredan la clase GridView, reemplazar el método Render, bucle a través de todas las células, descifrar su contenido, antes de ejecutar el método 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); 
    } 
} 

Opción 2: en una clase que hereda de GridView o en el Page o Control usarlo, hacer su propia inspección de la DataTable y crear una explícita BoundColumn para cada columna:

foreach (DataColumn column in dataTable.Columns) 
{ 
    GridViewColumn boundColumn = new BoundColumn 
     { 
      DataSource = column.ColumnName, 
      HeaderText = column.ColumnName, 
      HtmlEncode = false 
     }; 
    gridView.Columns.Add(boundColumn); 
} 
1

Bueno, como el html para el enlace ya está en su db, podría simplemente enviar el html a un control literal.

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

Esto debería hacer que su enlace como texto sin formato que permite que el navegador muestre como el enlace que esperar que sea.

7

Otra forma es añadir algo como lo siguiente al controlador de eventos 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

que fue capaz de lograr esto mediante el uso de la solución que Jørn Schou-Rode proporcionó, he modificado un poco para hacer que funcione desde el Evento RowDataBound de mi 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); 
      } 

    } 
} 
1

Uso 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; 
      } 
     } 
    } 
Cuestiones relacionadas