Запретить кодирование 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;
            }
        }
    }