c# - Visual Web Developer 用新的 HTML 替换内部 HTML

标签 c# innerhtml visual-web-developer

我制作了一个网页来显示图形,然后允许用户在其下方输入一些评论。提示用户输入,我试图将每个评论存储在一个列表中,然后将该列表显示为有序的 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使用 BulletStyleNumbered得到相同的结果。
更新您的 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/

相关文章:

c# - 抛出异常时退出 C# 控制台应用程序

javascript - innerHTML 无法将文本注入(inject)到标记中

asp.net-mvc - VS2008 Web Developer Express 如何在一个解决方案中添加多个项目?

browser - 实时服务器 Visual Studio Code 浏览器不会自动更新

css - visual web developer 中是否有像 visual studio 的 "Go to definition"这样的选项?

c# - 检测 ASP.NET 应用程序何时回收

c# - 如何格式化 stringbuilder 以在表格中发送我的电子邮件而不是纯文本

Javascript 使用 document.write 写入 innerHtml 的值

c# - Autofac - 无需传递容器即可解析运行时参数

Javascript 将 HTML 和 css 内容作为字符串返回,但不返回 javascript