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,我建议使用以下代码隐藏。我不使用标签作为 ListItems,因为 ViewState 对象需要可序列化。

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 回答