我制作了一个网页来显示图形,然后允许用户在其下方输入一些评论。提示用户输入,我试图将每个评论存储在一个列表中,然后将该列表显示为有序的 HTML 列表。相关代码如下:
<script runat="server">
private List<string> messages = new List<string>();
protected void Button2_Click(object sender, EventArgs e)
{
messages.Add(TextBox2.Text);
TextBox2.Text = "";
}
protected void Button3_Click(object sender, EventArgs e)
{
messages.Clear();
}
protected void Button4_Click(object sender, EventArgs e)
{
string output = "<ol>";
foreach (string message in messages)
{
output += "<li>";
output += message;
output += "</li>";
}
output += "</ol>";
Message.InnerHtml = Server.HtmlEncode(output);
}
protected void Chart1_Load(object sender, EventArgs e)
{
}
</script>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div>
Key Messages:<br />
<span id="Message" runat="server">
<asp:TextBox runat="server" ID="TextBox2" Width="500px"></asp:TextBox>
<asp:Button runat="server" ID="Button2" Text="Enter Message" Onclick="Button2_Click" />
<asp:Button runat="server" ID="Button3" Text="Clear Messages" onclick="Button3_Click" />
<asp:Button runat="server" ID="Button4" Text="Done" onclick="Button4_Click" />
</span>
</div>
</form>
</body>
</html>
输出结果是:
Key Messages:
<ol></ol>
所以我有两个谜团:
1) 为什么输入到文本框中的文本没有被添加到列表中
2) 为什么新的 HTML 显示为纯文本。
如有任何建议,我们将不胜感激。
问候。
最佳答案
1) 为什么输入文本框的文本没有添加到列表中
正如其他人所说,您不会在请求之间保留数据。
当你点击一个按钮时,整个页面都会重新实例化,导致你的 message
重新设置自身的变量。
Session
可以使用。例如替换你的 message
具有如下属性的字段:
private List<string> Messages
{
get
{
var messages = Session["Messages"] as List<string>;
if (messages == null)
{
messages = new List<string>();
Session["Messages"] = messages;
}
return messages;
}
}
2) 为什么新的 HTML 显示为纯文本。
(旁注 <ol>
中的标签 <span>
是无效的 Html,即使它可能呈现)
您正在编码您的 output
.
要获得所需的结果,您只需不要像这样对其进行编码:
(对此我不是 100% 确定,但我认为在实时系统上通过 IIS 运行时,IIS 可能会自动编码字符串,您再次遇到同样的问题,请查看建议的 BulletList
作为替代方案如果是这样的话。)
protected void Button4_Click(object sender, EventArgs e)
{
string output = "<ol>";
foreach (string message in Messages)
{
output += "<li>";
output += message;
output += "</li>";
}
output += "</ol>";
Message.InnerHtml = output;
}
另一种方法是使用 BulletList
使用 BulletStyle
的 Numbered
得到相同的结果。
更新您的 Html
像这样:
<div>
Key Messages:<br />
<span id="Message" runat="server">
<asp:TextBox runat="server" ID="TextBox2" Width="500px"></asp:TextBox>
<asp:Button runat="server" ID="Button2" Text="Enter Message" OnClick="Button2_Click" />
<asp:Button runat="server" ID="Button3" Text="Clear Messages" OnClick="Button3_Click" />
<asp:Button runat="server" ID="Button4" Text="Done" OnClick="Button4_Click" />
</span>
<asp:BulletedList BulletStyle="Numbered" ID="OutputMessages" runat="server">
</asp:BulletedList>
</div>
更改 Button4_Click
中的代码对此:
protected void Button4_Click(object sender, EventArgs e)
{
// If you want to hide the message controls.
Message.Visible = false;
foreach (var message in Messages)
{
OutputMessages.Items.Add(new ListItem(Server.HtmlEncode(message)));
}
}
总结
- 保留您的数据,例如使用
Session
- 如果您想要呈现传递的 html,请不要对您的数据进行编码(阅读下面的警告)
- 考虑使用
BulletList
而不是发回不安全的 html 字符串 - A
<ol>
<span>
内的标签是无效的 html
编码警告
如果不对来自服务器的数据进行编码,则可能会发送恶意脚本。例如,假设我们执行以下操作:
Message.InnerHtml = "<script>alert('Hello');</script>";
以上将执行显示警报的脚本。想象这是一个恶意脚本!
但是,如上所述,IIS 可能会自动编码字符串,在这种情况下,此脚本不会执行,但应呈现为纯文本。
关于c# - Visual Web Developer 用新的 HTML 替换内部 HTML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10922385/