1

こんにちは私はasp.net私が遊んでいる簡単なウェブフォームを持っています:

    <div id="in_mess" runat=server >

        <div class="dialog" runat=server> 
            <p class="dialog_interior">Test Message</p>
        </div>

    </div>

    <div id="out_mess" runat=server>

    </div>

</div>

<div id="mess_con" runat=server>

        <form runat=server id="form_con" >
            <p><label>Message</label><input type="text" width="250" id="inp_message"></p> <br>
            <p><label>To</label><input type="text" width="100" id="inp_recepeint"></p> <br>
            <asp:Button ID="ButtonChat" text="Chat" runat=server 
                onclick="ButtonChat_Click" />
        </form>



</div>

背後にあるコードでは、ButtonChatがクリックされたときの次の簡単な関数を実装しました。

protected void ButtonChat_Click(object sender, EventArgs e)
{
    this.in_mess.Controls.Add(new Label { Text = "Hello", CssClass = "dialog" });
}

問題は、divに複数のラベルを追加できないことです。追加したラベルは残りますが、何度クリックしても新しいラベルが追加されないことがわかります。

行にブレークポイントを設定しましたが、コントロールコレクションの数が3のまま変更されていないことが示されています。

JavaScriptを介してタグを追加するときに同様の問題が発生し<p>、フォームによるページの再読み込みを停止して修正しましたが、これをASP.NETに適用できるかどうかはわかりません。

4

2 に答える 2

2

あなたはページのリロードについてのあなたの考えで正しい軌道に乗っています。WebFormsでは、onclickイベントが完全なポストバックを生成します。動的に追加されたコントロールは自動的に記憶されないため、マークアップページに追加するのは1つだけです。

追加したラベルの数を覚えておいて、ページの読み込み時にそれらをすべて再度追加することはできますが、そのソリューションはあまり好きではありません。

たぶん、onclientclickを使用して、Javascriptを使用してラベルを追加できますか?

<script type="text/javascript">
    function ButtonChat_Click(){
        var label = document.createElement("label");
        label.className = "dialog";
        label.createTextNode("Hello");
        document.getElementById("in_mess").appendChild(label);
    }
 </script>

 <div id="in_mess" runat=server >
    <div class="dialog" runat=server> 
        <p class="dialog_interior">Test Message</p>
    </div>

 </div>

 <div id="out_mess" runat=server>

 </div>

 <div id="mess_con" runat=server>

     <form runat=server id="form_con" >
        <p><label>Message</label><input type="text" width="250" id="inp_message"></p> <br>
        <p><label>To</label><input type="text" width="100" id="inp_recepeint"></p> <br>
        <asp:Button ID="ButtonChat" text="Chat" runat=server onclientclick="ButtonChat_Click" />
     </form>

 </div>
于 2013-03-10T17:55:35.277 に答える
1

ここでの解決策はJavascriptだけではありません。いくつかのポストバックにわたってページの状態を維持するには、サイトのビューステートを処理する必要があります。これは、プロパティ値を複数のポストバックにわたって永続的に維持するなど、他の場合にも非常に役立ちます。

ASPXを利用して、次のコードビハインドをお勧めします。ViewStateオブジェクトはシリアル化可能である必要があるため、LabelsをListItemsとして使用しません。

public partial class _default : System.Web.UI.Page
{
    public List<LabelInfo> LabelInfos
    {
        get
        {
            object listOfLabelInfos = ViewState["Labels"];
            return (listOfLabelInfos == null) ? null : (List<LabelInfo>)listOfLabelInfos;
        }
        set
        {
            ViewState["Labels"] = value;
        }
    }

    protected void Page_Load(object sender, EventArgs e)
    {
        // Init the LabelInfo list, if this page load is not a postback.
        if (!IsPostBack)
        {
            LabelInfos = new List<LabelInfo>();
        }
    }

    protected void btnTest_Click(object sender, EventArgs e)
    {
        LabelInfos.Add(new LabelInfo { Text = "TestLabel", CssClass = "TestClass" });

        foreach (LabelInfo l in LabelInfos)
        {
            this.in_mess.Controls.Add(new Label { Text = l.Text, CssClass = l.CssClass });
        }
    }
}

[Serializable]
public class LabelInfo
{
    public string Text = "";
    public string CssClass = "";
}
于 2013-03-10T18:53:30.050 に答える