友 在我的formview InsertTemplate中,我们有几个文本框。保存数据时,我们运行循环以在ItemInserting期间使用循环清理数据:
Server.HtmlEncode(e.Values[a].ToString());
因此,诸如
之类的值<script> alert('Hello, World!') </script>
转换并保存为
<script> alert('Hello, World!') </script>
我们在EDITTEMPLATE时向用户显示相同的值。这是通过激活EDITTEMPLATE中每个文本框附带的以下代码来完成的。
OnDataBinding="DecodeTextBox_DataBinding"
C#代码:
((TextBox)sender).Text = HttpUtility.HtmlDecode(((TextBox)sender).Text);
执行此操作后,EDITTEMPLATE文本框会准确显示用户已保存的内容,即:
<script> alert('Hello, World!') </script>
问题在于,我们必须根据客户的需求添加其他文本框,这些请求太多了。有时我们忘记将数据绑定HtmlDecode附加到新文本框。 有没有办法在EDITTEMPLATE上使用HtmlDecode运行循环?
答案 0 :(得分:0)
虽然,我会考虑做一个更清洁的解决方案。问题是文本框控件对已编码的HTML字符串进行编码。因此,要批量解码它们,您可以尝试这样的事情。
拥有这样的表格视图:
<asp:FormView ID="myFormView" OnDataBound="myFormView_DataBound" DefaultMode="Edit" runat="server">
<EditItemTemplate>
<asp:TextBox runat="server" ID="TextBox1" Text='<%# DataBinder.Eval(Container.DataItem,"ItemA") %>'></asp:TextBox>
<asp:TextBox runat="server" ID="TextBox2" Text='<%# DataBinder.Eval(Container.DataItem,"ItemB") %>'></asp:TextBox>
</EditItemTemplate>
<ItemTemplate>
<asp:Literal runat="server" ID="TextBox1" Text='<%# DataBinder.Eval(Container.DataItem,"ItemA") %>'></asp:Literal>
<asp:Literal runat="server" ID="TextBox2" Text='<%# DataBinder.Eval(Container.DataItem,"ItemB") %>'></asp:Literal>
</ItemTemplate>
</asp:FormView>
在数据绑定执行完毕后,您可以递归HtmlDecode其中的所有文本框:
public partial class _Default : Page
{
protected void Page_Load(object sender, EventArgs e)
{
var data = new[]{
new DataObject(){
ItemA = "<div>Item 1</div>",
ItemB = "<div>Item 2</div>"
}
};
myFormView.DataSource = data;
myFormView.DataBind();
}
protected void myFormView_DataBound(object sender, EventArgs e)
{
var form = (FormView)sender;
HtmlDecode(form);
}
private void HtmlDecode(Control control)
{
if (control == null)
return;
foreach(var child in control.Controls.Cast<Control>())
HtmlDecode(child);
var textBox = control as TextBox;
if (textBox == null)
return;
textBox.Text = HttpUtility.HtmlDecode(textBox.Text);
}
}
public class DataObject
{
public string ItemA { get; set; }
public string ItemB { get; set; }
}