Запретить кодирование HTML в автогенерированных столбцах GridView
У меня есть GridView, связанный с DataTable, который я создаю. Большинство столбцов в таблице содержат необработанный HTML для hypelinklink, и я бы хотел, чтобы этот HTML-код отображался как ссылка в браузере, но GridView автоматически кодирует HTML-код, поэтому он отображается как разметка.
Как я могу избежать этого без явного добавления столбцов HyperLink или любых других?
Ответы
Ответ 1
Просто установите для свойства BoundColumn.HtmlEncode
значение false:
<asp:BoundField DataField="HtmlLink" HtmlEncode="false" />
дел >
Я боюсь, что нет простого способа отключить HTML-кодирование содержимого в GridView
с помощью AutoGenerateColumns
= true
, Однако я могу подумать о двух обходных решениях, которые могут решить проблему, с которой вы сталкиваетесь:
Вариант 1: Наследуйте класс GridView
, переопределите метод Render
, пропустите все ячейки, декодируйте их содержимое перед выполнением базового метода:
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);
}
}
Вариант 2: В классе, наследующем от GridView
или в Page
или Control
, используя его, сделайте свой собственный осмотр DataTable
и создайте явный BoundColumn
для каждого столбца:
foreach (DataColumn column in dataTable.Columns)
{
GridViewColumn boundColumn = new BoundColumn
{
DataSource = column.ColumnName,
HeaderText = column.ColumnName,
HtmlEncode = false
};
gridView.Columns.Add(boundColumn);
}
Ответ 2
Другой способ - добавить в обработчик событий 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
Ответ 3
Я смог достичь этого, используя решение, которое предоставил Jørn Schou-Rode, я немного изменил его, чтобы он работал из события RowDataBound моего 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);
}
}
}
Ответ 4
Ну, так как html для ссылки уже находится в вашем db, вы можете просто выводить html на литеральный элемент управления.
<asp:TemplateField HeaderText="myLink" SortExpression="myLink">
<ItemTemplate>
<asp:Literal ID="litHyperLink" runat="server" Text='<%# Bind("myLink", "{0}") %>' />
</ItemTemplate>
</asp:TemplateField>
Это должно сделать вашу ссылку в виде необработанного текста, позволяя браузеру отображать ее как ссылку, которую вы ожидаете.
Ответ 5
Использовать 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;
}
}
}