web-dev-qa-db-ja.com

自動生成されたGridView列でHTMLエンコードを防止する

作成したDataTableにバインドされたGridViewがあります。テーブルのほとんどの列には、hypelinklinkの未加工のHTMLが含まれています。そのHTMLをブラウザーでリンクとしてレンダリングしたいのですが、GridViewはHTMLを自動的にエンコードするため、マークアップとしてレンダリングされます。

ハイパーリンクやその他の列を明示的に追加せずにこれを回避するにはどうすればよいですか?

20
ProfK

BoundColumn.HtmlEncode プロパティをfalseに設定するだけです。

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


GridView= trueを使用してAutoGenerateColumnsのコンテンツのHTMLエンコーディングを無効にする簡単な方法はないと思います。しかし、私はあなたが直面している問題を解決するかもしれない2つの回避策を考えることができます:

オプション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);
}
27

JørnSchou-Rodeが提供したソリューションを使用してこれを達成することができました。グリッドビューのRowDataBoundイベントから機能するように少し変更しました。

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);
           }

    }
}
9
Cesar Duran

別の方法は、次のようなものを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
JMS

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;
            }
        }
    }
3
R0man

まあ、リンクのhtmlは既にdbにあるので、htmlをリテラルコントロールに出力するだけです。

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

これにより、リンクが未加工のテキストとしてレンダリングされ、ブラウザーが期待どおりのリンクとしてレンダリングできるようになります。

2
Joel Etherton

すべての回答はC#であるように見え、質問は具体的ではなかったため、ASP.NetとVB.Netを使用してこの問題に遭遇しましたが、VB(私はそれがC#で機能することを想像しますが、これがVB.NetでASP私が持っているようにつまずく人)で作業する人を助けることを願っています。

VB.Netでは、BoundColumnGridview.Columnsではないため、System.Web.UI.WebControls.DataControlFieldに追加できません。代わりに、BoundFieldを使用する必要がありますDataControlField

BoundColoumnにもHtmlEncodeプロパティはありませんが、BoundFieldにはあります。また、VB.NetではDataSourceDataFieldになります。

        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は上記で追加された列とともに列を生成します。

1
DavidScherer

すべての行と列でHTMLエンコーディングを無効にする場合は、RowDataBoundイベントでこのコードを使用できます。

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;
        }
    }
}
1
Manish Nayak