1

我正在使用动态文本框,然后在文件后面的代码中获取它们的值。我正在使用 Javascript 创建这些框。我的 asp.net 页面代码是

    <script type="text/javascript">

        $(document).ready(function () {

            var counter = 1;

            $("#addButton").click(function () {

                if (counter > 10) {
                    alert("Only 10 textboxes allow");
                    return false;
                }

                var newTextBoxDiv = $(document.createElement('div'))
                     .attr("id", 'TextBoxDiv' + counter);


                newTextBoxDiv.html('<input type="text" name="textbox' + counter +
                      '" id="textbox' + counter + '" value="" >');

                newTextBoxDiv.appendTo("#TextBoxesGroup");
                counter++;
                return false;
            });
        });
    </script>

</head>

<body>

    <form id="form2" runat="server">

        <h1>jQuery add / remove textbox example</h1>

        <asp:TextBox runat="server" ID="txt1" type='text' name="textname" />
        <asp:Panel runat="server" ID='TextBoxesGroup'>
        </asp:Panel>
        <asp:LinkButton ID="addButton" runat="server">Add TextBox</asp:LinkButton>

        <asp:Button ID="Button1" runat="server" Text="Button" OnClick="Button1_Click" />
    </form>
    <asp:Label ID="Label1" runat="server" Text=""></asp:Label>
</body>

我在页面上显示了一个文本框,当没有创建动态文本框时,它应该只显示一个值。我的 C# 代码是

 protected void Button1_Click(object sender, EventArgs e)
    {
        string name = txt1.Text + ",";
        if (TextBoxesGroup.Controls.Count  > 0)
        {           
            for (int i = 1; i <= TextBoxesGroup.Controls.Count; i++)
            {
                name += Request.Form["textbox" + i] + ",";
            }    
        }

        Label1.Text = name;
    }

在 asp:button 点击​​它应该显示由 (,) 分隔的所有值。但它只显示前 2 个值,其中一个是 asp:Textbox,第二个是动态文本框,我想要动态创建的所有文本框的值,当没有添加动态文本框时,它应该只显示来自 asp 的值:文本框...提前致谢

4

2 回答 2

3

在客户端通过 javascript 创建的Htmlinput元素不会出现在TextBoxesGroup.Controls服务器上。

客户端 DOM 结构的更改对Page'sControl树没有影响。唯一受影响的是HttpRequest回发期间的内容。了解有多少动态创建input的元素对Request.Form数据有贡献的一种方法是将此信息作为请求的一部分传递。这就是为什么您必须使用隐藏字段建议的原因。隐藏字段值将带回客户端输​​入的计数。每次创建新输入时都必须在 javascript 中设置它,在服务器端代码中读取它,转换为整数并在for循环中使用。

添加

<asp:HiddenField runat="server" ID="txtDynamicCount" value="0" />

到标签内的form标记。在行后的javascriptclick事件中counter++;添加

$("#txtDynamicCount").val(counter);

Button1_Click

int count;
if (!int.TryParse(txtDynamicCount.Value, out count))
    count = 0;

for (int i = 1; i <= count; i++)
{
...
}

与其他答案的重要区别是文本框(输入元素)不会在表单提交之间持续存在。

于 2013-03-13T17:39:53.540 回答
1

您不能在客户端填充服务器控件。相反,您想从服务器填充它们。这是样本 -

在此处输入图像描述

<asp:PlaceHolder runat="server" ID="PlaceHolder1"></asp:PlaceHolder>
<asp:LinkButton ID="addButton" runat="server" OnClick="btnAdd_Click">Add TextBox</asp:LinkButton>
<asp:Button ID="Button1" runat="server" Text="Button" OnClick="Button1_Click" /><br/>
Posted Results: <asp:Label ID="Label1" runat="server" Text=""></asp:Label>

private List<int> _controlIds;

private List<int> ControlIds
{
    get
    {
        if (_controlIds == null)
        {
            if (ViewState["ControlIds"] != null)
                _controlIds = (List<int>)ViewState["ControlIds"];
            else
                _controlIds = new List<int>();
        }
        return _controlIds;
    }
    set { ViewState["ControlIds"] = value; }
}

protected void Page_Load(object sender, EventArgs e)
{
    if (IsPostBack)
    {
        foreach (int id in ControlIds)
        {
            var textbox = new TextBox();
            textbox.ID = id.ToString();

            PlaceHolder1.Controls.Add(textbox);
        }
    }
}

protected void btnAdd_Click(object sender, EventArgs e)
{
    var reqs = ControlIds;
    int id = ControlIds.Count + 1;

    reqs.Add(id);
    ControlIds = reqs;

    var textbox = new TextBox();
    textbox.ID = id.ToString();

    PlaceHolder1.Controls.Add(textbox);
}

protected void Button1_Click(object sender, EventArgs e)
{
    var ids = ControlIds;
    foreach (var id in ids)
    {
        var textbox = (TextBox)PlaceHolder1.FindControl(id.ToString());
        Label1.Text += textbox.Text + ", ";
    }
}
于 2013-03-13T18:10:37.023 回答