向用户控件动态添加并持久化TextBoxes

本文关键字:持久化 TextBoxes 添加 动态 用户 控件 | 更新日期: 2023-09-27 17:59:05

使用C#.NET 4.0和Umbraco

我有一个用户控件,上面有一个按钮,允许用户向表单中动态添加额外的文本框。我尝试了无数种方法,但无法在页面加载之间保持输入到动态文本框中的任何数据。

这是用户界面:

<div id="new-item">
<h3>Add new menu item</h3>
<div><label for="ItemTitle">Title</label><asp:TextBox ID="ItemTitle" runat="server" CssClass="title"></asp:TextBox></div>
<div><label for="ItemDescription">Text</label><textarea id="ItemDescription" runat="server" rows="5" cols="20"></textarea></div>
<div><label for="ItemPrice">Price</label><asp:TextBox ID="ItemPrice" runat="server" CssClass="price"></asp:TextBox></div>
<div class="new-item-options">
    <p><strong>Menu item options (optional) </strong><asp:Button ID="AddMenuItemOption" runat="server" Text="Add Option" OnClick="AddOption" /></p>
    <asp:Panel ID="MenuItemOptionsPanel" runat="server"></asp:Panel>
    <asp:HiddenField ID="ItemOptionCount" runat="server" />
</div>
<div><asp:Button ID="AddItemButton" runat="server" Text="Save" /></div>
<asp:HiddenField ID="ItemID" runat="server" />
<asp:HiddenField ID="ItemOrder" runat="server" />

在AddOption按钮点击事件中:

protected void AddOption(object sender, EventArgs e)
{
    var dynamicControlCount = Convert.ToInt32(ItemOptionCount.Value) + 1;
    for (var option = 0; option < dynamicControlCount; option++)
    {
        MenuItemOptionsPanel.Controls.Add(new Literal { ID = "OptionTextLiteral" + option, Text = "<label>Option Text</label>" });
        MenuItemOptionsPanel.Controls.Add(new TextBox { ID = "OptionTextBox" + option });
        MenuItemOptionsPanel.Controls.Add(new Literal { ID = "OptionPriceLiteral" + option, Text = "<label>Option Price</label>" });
        MenuItemOptionsPanel.Controls.Add(new TextBox { ID = "OptionPriceBox" + option });
    }
    ItemOptionCount.Value = dynamicControlCount.ToString();
}

我知道我需要在Page_Load或OnInit方法中创建这些动态控件,但问题是,当页面第一次加载时,我不希望创建任何动态控件,只有当用户每次单击按钮时,我才会添加额外的控件,并且那些已经存在的控件中保留了任何数据。

有什么想法吗?我不认为我离得太远了:)

向用户控件动态添加并持久化TextBoxes

你能在page_load中测试confition(可能是IsPostback)吗?如果你需要生成控件,那就去做吧?

也许你必须看看这篇(系列)文章。它详细解释了如何使用动态创建的控件,特别是如何持久化ViewState。

否则,我建议您采用AJAX方式(使用JavaScript创建控件,使用AJAX将数据发布回服务器以供服务器处理)。在这种情况下,您不必担心PostBack和ViewState,它也会让用户体验更好!