Запретить кодировку HTML в автоматически генерируемых столбцах GridView - PullRequest
20 голосов
/ 30 января 2010

У меня есть GridView, связанный с DataTable, который я создаю. Большинство столбцов в таблице содержат необработанный HTML-код для гиперссылки, и я хотел бы, чтобы этот HTML отображался как ссылка в браузере, но GridView автоматически кодирует HTML, поэтому он отображается как разметка.

Как можно избежать этого без явного добавления HyperLink или каких-либо других столбцов?

Ответы [ 7 ]

27 голосов
/ 30 января 2010

Просто установите для свойства 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);
}
9 голосов
/ 05 ноября 2012

Мне удалось добиться этого с помощью решения, предоставленного Йорном Шоу-Роде, я немного изменил его, чтобы он работал из события 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);
           }

    }
}
7 голосов
/ 06 января 2011

Другой способ - добавить что-то вроде следующего в обработчик событий 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 голосов
/ 27 декабря 2014

Использовать 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 голосов
/ 30 января 2010

Ну, так как html для ссылки уже находится в вашей базе данных, вы можете просто вывести html в литеральный элемент управления.

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

Это должно отобразить вашу ссылку в виде необработанного текста, что позволит браузеру отображать ее как ожидаемую ссылку.

1 голос
/ 19 февраля 2019

Поскольку все ответы, похоже, находятся на C #, а вопросы не были конкретными, я столкнулся с этой проблемой, используя ASP.Net и VB.Net, и принятое решение не помогло мне в VB (хотя я думаю, что оно работаетв C #).Надеемся, что это поможет любому, кто работает с VB.Net в ASP, кто сталкивается с этим, как я.

В VB.Net BoundColumn нельзя добавить к Gridview.Columns, поскольку это не System.Web.UI.WebControls.DataControlField, поэтому вместо одногодолжен использовать BoundField, который DataControlField.

BoundColoumn также не имеет свойства HtmlEncode, однако BoundField.Кроме того, в VB.Net DataSource становится 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()

Также обратите внимание, что вы должны явно установить AutoGenerateColumns="False", иначе GridView будет по-прежнему генерировать столбцы вместе с добавленными выше столбцами.

0 голосов
/ 25 мая 2018

Этот код можно использовать в событии RowDataBound, если вы хотите отключить кодировку HTML во всех строках и столбцах.

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;
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...