27

我有一个绑定到 ObjectDataSource 的 GridView。我也支持编辑,效果很好。但是,我想安全地对显示的文本进行 HtmlEncode,因为我们确实允许在某些字段中使用特殊字符。这与标准 BoundFields 无关,因为我只是将 HtmlEncode 设置为 true。

但是为了设置验证控件,需要使用 TemplateFields。如何轻松添加 HtmlEncoding 以这种方式输出?这是一个 ASP.NET 2.0 项目,所以我使用较新的数据绑定快捷方式(例如EvalBind)。

我想做的是如下所示:

<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:当前上下文中不存在名称“绑定”

4

9 回答 9

36

现在可以使用 ASP.NET 4 中引入的新 HTML 编码数据绑定语法来实现。

您可以简单地使用:

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

或者

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

注意井号/井号后面的冒号就这么简单。

于 2013-11-06T12:34:58.197 回答
17

引自http://weblogs.asp.net/leftslipper/archive/2007/06/29/how-asp-net-databinding-deals-with-eval-and-bind-statements.aspx

ASP.NET 中没有 Bind 方法。当 ASP.NET 解析您的文件并看到您正在使用

它会为它生成一些特殊的代码。当您使用它时,它不是真正的函数调用。如果 ASP.NET 分析代码并检测到 Bind() 语句,它会将语句分成两部分。第一部分是单向数据绑定部分,最终只是一个常规的 Eval() 调用。第二部分是反向部分,通常是一些类似于“string name = TextBox1.Text”的代码,用于从绑定的位置获取值。但是,因为 ASP.NET 必须解析 Bind() 语句,所以双向数据绑定不支持除 Bind() 之外的任何内容。例如,以下语法是无效的,因为它试图调用任意代码并同时使用 Bind():

双向数据绑定中支持的唯一格式是 Bind("field") 和 Bind("field", "format string {0}")。

您可以在 EditItemTemplate 中使用 Eval 而不是 Bind。您还需要转换为字符串:

<asp:Label ID="LabelDescription" 
           runat="server" 
           Text='<%# System.Web.HttpUtility.HtmlEncode((string)Eval("Description")) %>' />
于 2009-02-04T18:16:02.193 回答
9

正如 Darin Dimitrov 已经解释的那样,您不能将Bind其用作函数的参数。所以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)。

但是自动编码不是例如标签的情况。虽然您也可以Bind在标签的 Text 属性中使用,但标签的输出不会自动编码 - 这就是为什么使用Bind标签不是一个好习惯的原因,因为您不能使用Bind. 而是使用Eval它并将其包装到 HtmlEncode 中,就像您在 ItemTemplate 中所做的那样: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() 用于双向数据绑定,为此,您必须使用 gridview 的 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 回答
2

在我的情况下,我被迫在 mi EditItemTemplate 的 TextBox 上使用“Bind”方法,因为需要在 item_Updating 事件处理的 NewValues 数组中访问数据。所以我想出如下:

在我的 EditItemTemplate 上:

<EditItemTemplate>
     <asp:TextBox runat="server" Text='<%# Bind("field")%>' ID="TextBox112" OnPreRender="TextBox_PreRender_decode"></asp:TextBox>                                            
</EditItemTemplate> 

然后在后面的代码中:

protected void TextBox_PreRender_decode(object sender, EventArgs e)
{
    TextBox tb = (TextBox)sender;
    tb.Text = WebUtility.HtmlDecode(tb.Text);
}

该解决方案允许我正确显示所有文本框的 html 编码数据,同时能够在 item_Updating 事件触发时从 newValues 数组访问这些数据。

于 2016-08-31T13:23:55.683 回答
1

请参考

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

我从这里得到了工作解决方案。它对我来说就像一个魅力。

于 2010-09-16T11:34:48.983 回答
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 回答
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 回答