27

ObjectDataSource にバインドされた GridView があります。編集もサポートしていますが、問題なく機能します。ただし、特定のフィールドで特殊文字を許可しているため、表示されるテキストを安全に HtmlEncode したいと考えています。これは、HtmlEncode を true に設定しただけなので、標準の BoundFields で行うのは簡単です。

ただし、検証コントロールを設定するには、代わりに TemplateFields を使用する必要があります。この方法で出力するために HtmlEncoding を簡単に追加するにはどうすればよいですか? これは ASP.NET 2.0 プロジェクトなので、新しいデータ バインディング ショートカット (Evalおよび などBind) を使用しています。

私がやりたいことは、次のようなものです。

<asp:TemplateField HeaderText="Description">
    <EditItemTemplate>
        <asp:TextBox ID="TextBoxDescription" runat="server"
                     Text='<%# System.Web.HttpUtility.HtmlEncode(Bind("Description")) %>'
                     ValidationGroup="EditItemGrid"
                     MaxLength="30" />
        <asp:Validator ... />
    </EditItemTemplate>
    <ItemTemplate>
        <asp:Label ID="LabelDescription" runat="server"
                   Text='<%# System.Web.HttpUtility.HtmlEncode(Eval("Description")) %>' />
    </ItemTemplate>
</asp:TemplateField>

ただし、この方法で試してみると、次のエラーが発生します。

CS0103: 'Bind' という名前は現在のコンテキストに存在しません

4

9 に答える 9

36

これは、ASP.NET 4 で導入された新しい HTML エンコーディング データバインディング構文を使用して実行できるようになりました。

以下を簡単に使用できます。

<%#: Eval("MyField") %>

または

<%#: Bind("MyField") %>

ポンド/ハッシュ記号の後のコロンに注意してください。これは単純です。

于 2013-11-06T12:34:58.197 に答える
9

BindDarin Dimitrov によって既に説明されているように、関数のパラメーターとして使用することはできません。だからText='<%# System.Web.HttpUtility.HtmlEncode(Bind("Description")) %>'ありえない。一方、通常、ここで HtmlEncode を使用する必要はありませんBind。たとえば、TextBox と一緒に (EditItemTemplate の例のように) データを変更できるコントロールを使用するためです。ただし、TextBox は自動的にエンコードされるためBind、HtmlEncode を必要とせずに安全に呼び出すことができます。

<EditItemTemplate>
    <asp:TextBox ID="TextBoxDescription" runat="server"
                 Text='<%# Bind("Description") %>'
                 ValidationGroup="EditItemGrid"
                 MaxLength="30" />
    <asp:Validator ... />
</EditItemTemplate>

TextBox が自動的にエンコードされない場合、これを使用Bindすると大きなセキュリティ ホールになります (エンコードせずにデータを安全に HTML にレンダリングできることが絶対に確実でない限り)。

ただし、自動エンコーディングは、たとえばラベルには当てはまりません。ラベルの Text プロパティでも使用できますBindが、ラベルへの出力は自動的にはエンコードされませBindBind。代わりに、ItemTemplate で行ったように、それを使用Evalして HtmlEncode にラップします。Text='<%# System.Web.HttpUtility.HtmlEncode((string)Eval("Description")) %>'

于 2010-04-10T23:07:19.770 に答える
6
<asp:TemplateField HeaderText="Description">     
  <EditItemTemplate>         
    <asp:TextBox ID="TextBoxDescription" runat="server" Text='<%# System.Web.HttpUtility.HtmlEncode(Bind("Description")) %>'                ValidationGroup="EditItemGrid"  MaxLength="30" />
     <asp:Validator ... />     
  </EditItemTemplate>     
  <ItemTemplate>         
     <asp:Label ID="LabelDescription" runat="server"  Text='<%# System.Web.HttpUtility.HtmlEncode(Convert.ToString(Eval("Description"))) %>' /> 
  </ItemTemplate> 
</asp:TemplateField> 
于 2012-10-17T05:46:13.573 に答える
2

Bind() はTwo-Way Data Bindingに使用されます。これを機能させるには、グリッドビューのRowUpdatingイベントを使用する必要があります 。

void GridView_RowUpdating(Object sender, GridViewUpdateEventArgs e)
{
    foreach (DictionaryEntry entry in e.NewValues)
    {
        e.NewValues[entry.Key] = System.Web.HttpUtility.HtmlEncode(entry.Value.ToString());
    }
}
于 2009-02-05T07:10:59.677 に答える
1

単純な拡張メソッドはどうですか?

public static string HtmlEncode(this string s)
    {            
        s = HttpUtility.HtmlEncode(s);
        return s;
    }

その後、次のように実行するだけです。

<asp:Label runat="server" Text=<%# ((string)Eval("MyStringField")).HtmlEncode() %> />
于 2010-09-08T14:52:23.693 に答える
1

を参照してください。

http://forums.asp.net/p/1056231/1504717.aspx

here から実用的なソリューションを入手しました。それは私にとって魅力のように機能します。

于 2010-09-16T11:34:48.983 に答える
0

ただし、Phaedrus の次のコードを使用していて、チェックボックス列がある場合は注意してください。

void GridView_RowUpdating(Object sender, GridViewUpdateEventArgs e)
{
    foreach (DictionaryEntry entry in e.NewValues)
    {
        e.NewValues[entry.Key] = System.Web.HttpUtility.HtmlEncode(entry.Value.ToString());
    }
}

はチェックボックスから真を真にするためentry.Value.ToString()、データベースフィールドに保存することはできません!

于 2010-03-04T04:18:19.097 に答える