如何在TemplateFields,Data Binding和GridView中使用HtmlEncode

Sea*_*ley 23 asp.net data-binding gridview html-encode templatefield

我有一个绑定到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>
Run Code Online (Sandbox Code Playgroud)

但是,当我这样尝试时,我收到以下错误:

CS0103:当前上下文中不存在名称"Bind"

pat*_*ter 31

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

你可以简单地使用:

<%#: Eval("MyField") %>
Run Code Online (Sandbox Code Playgroud)

要么

<%#: Bind("MyField") %>
Run Code Online (Sandbox Code Playgroud)

注意磅/井号后的冒号就这么简单.

  • Waww ..一百万美元答案..谢谢 (2认同)

Dar*_*rov 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")) %>' />
Run Code Online (Sandbox Code Playgroud)


Sla*_*uma 8

正如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>
Run Code Online (Sandbox Code Playgroud)

如果TextBox不会自动编码,那Bind将是一个巨大的安全漏洞(除非您绝对确定您的数据可以安全地在没有编码的情况下呈现为HTML).

但是例如标签的自动编码不是这种情况.虽然您也可以Bind在标签的Text属性中使用,但标签的输出不会自动编码 - 使用Bind标签的原因不是一个好习惯,因为您无法使用标签文本进行编码Bind.而是使用Eval并将其包装到HtmlEncode中,就像在ItemTemplate中一样:Text='<%# System.Web.HttpUtility.HtmlEncode((string)Eval("Description")) %>'


小智 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> 
Run Code Online (Sandbox Code Playgroud)