2

グラフィックを表示する Web ページを作成し、ユーザーがその下にコメントを入力できるようにしました。ユーザーは入力を求められ、各コメントをリストに保存してから、リストを順序付けされた 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>

だから私には2つの謎があります:

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 がプレーン テキストとして表示されるのはなぜですか。

(補足として<ol>、a 内のタグ<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;
}

別の方法として、 ofを使用して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 をレンダリングする場合は、データをエンコードしないでください (以下の警告をお読みください)。
  • BulletListhtml の安全でない文字列を送り返す代わりに、a を使用することを検討してください
  • a 内の<ol>タグ<span>が無効な html です

エンコードに関する警告

サーバーから送信されるデータをエンコードしないと、悪意のあるスクリプトが送信される可能性があります。たとえば、次のようにするとします。

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

上記は、アラートを表示するスクリプトを実行します。これが悪意のあるスクリプトだと想像してみてください。

ただし、前述のように、IIS は文字列を自動エンコードする場合があり、その場合、このスクリプトは実行されませんが、プレーン テキストとしてレンダリングされます。

于 2012-06-06T21:43:38.243 に答える
0

Webページがどのように機能するかを理解する必要があります。ボタン/ハイパーリンクをクリックするたびに、新しいhttpリクエストが作成され、その過程で新しいページが取得されます(ajaxを使用している場合を除きますが、これは別の問題です)。

List型のプライベート変数を設定できますが、これはページの現在のインスタンスにのみ固有です。ユーザーがリクエストを行うと(ボタンをクリックするなど)、ページの新しいインスタンスが作成され、ユーザーに返されます=>リストは常に空になります。Httpはステートレスであるため、リクエスト間でデータの永続性を実行する方法が必要です。

リストがユーザーに固有の場合は、ViewStateまたはSessionStateを使用して、必要に応じてデータを保存/取得できます。よりグローバルなものである場合は、データベース/ファイルを永続媒体として使用してください。

于 2012-06-06T21:19:34.293 に答える