asp.net - net - Evite la codificación HTML en columnas GridView generadas automáticamente
gridview asp.net vb (5)
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.
¿Cómo puedo evitar esto sin agregar explícitamente HyperLink, o cualquier otra columna?
Bien, 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 mostrar su enlace como texto sin procesar, lo que permite que el navegador lo represente como el enlace que espera que sea.
Otra forma es agregar 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
Pude lograr esto utilizando la solución que Jørn Schou-Rode proporcionó, la modifiqué un poco para 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);
}
}
}
Simplemente configure la propiedad BoundColumn.HtmlEncode
en false:
<asp:BoundField DataField="HtmlLink" HtmlEncode="false" />
Me temo que no hay una manera fácil de deshabilitar la codificación HTML de los contenidos en un GridView
con AutoGenerateColumns
= true
. Sin embargo, puedo pensar en dos soluciones que podrían resolver el problema al que se enfrenta:
Opción 1: Heredar la clase GridView
, anular el método Render
, recorrer todas las celdas, decodificar sus contenidos, antes de ejecutar el método 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 la Page
o Control
utiliza, realice su propia inspección de la DataTable
y cree una BoundColumn
explícita 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);
}
Use 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;
}
}
}