2

我制作了一个网页来显示一个图形,然后允许用户在它下面输入一些评论。提示用户输入,我试图将每个评论存储在一个列表中,然后将该列表显示为一个有序的 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 显示为纯文本。

任何建议表示赞赏。

问候。

4

3 回答 3

1

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 显示为纯文本。

(在旁注中,a 中的<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;
}

另一种方法是使用 aBulletList来获得相同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 来呈现,请不要对数据进行编码(阅读下面的警告)
  • 考虑使用 aBulletList而不是发回不安全的 html 字符串
  • a中的<ol>标签<span>是无效的 html

编码警告

如果不对来自服务器的数据进行编码,则可能会发送恶意脚本。例如,假设我们执行以下操作:

Message.InnerHtml = "<script>alert('Hello');</script>";

以上将执行显示警报的脚本。想象这是一个恶意脚本!

但是,如上所述,IIS 可能会自动编码字符串,在这种情况下,此脚本将不会执行,而是应呈现为纯文本。

于 2012-06-06T21:43:38.243 回答
0

您必须了解网页的工作原理。每次单击按钮/超链接都会创建一个新的 http 请求,并在此过程中检索一个新页面(除非您使用 ajax,但这是另一回事)。

您可以设置 List 类型的私有变量,但这仅适用于页面的当前实例。当用户发出请求(例如单击按钮)时,会创建一个新的页面实例并将其返回给用户 => 列表将始终为空。Http 是无状态的,您需要一种方法来在请求之间执行数据的持久性。

如果列表是特定于用户的,您可以根据需要使用 ViewState 或 SessionState 来存储/检索数据。如果它是一个更全球化的东西,请使用数据库/文件作为持久性介质。

于 2012-06-06T21:19:34.293 回答
0

List 不是静态的,因此每次请求页面时都会重新定义它。

您将其视为播放文本的原因是您对输出进行了 HtmlEncode。所以 < 和 > 成为字符的 HTML 表示(< 和 >)。

Message.InnerHtml = output;

应该纠正

于 2012-06-06T21:25:10.397 回答