Sea*_*ley 23 asp.net data-binding gridview html-encode templatefield
我有一个绑定到ObjectDataSource的GridView.我也支持编辑,这很好用.但是,我想安全地显示HtmlEncode文本,因为我们允许在某些字段中使用特殊字符.这与标准的BoundFields有关,因为我只是将HtmlEncode设置为true.
但是为了设置验证控件,需要使用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>
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)
注意磅/井号后的冒号就这么简单.
Dar*_*rov 17
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)
正如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)
| 归档时间: |
|
| 查看次数: |
50731 次 |
| 最近记录: |