2

我需要创建以下功能,并寻找在多个回发中存储信息的最佳方式:

假设我有一个文本框,它与一个问题有关,即“我去过的地方”。一旦 TextBox 将在第一次加载时加载。在此之下,有一个“添加另一个地方”的按钮。这将回发,然后将在第一个文本框下方添加另一个文本框。这可以做 x 次。

我的问题是,考虑到此加载需要在 Init 事件中完成,并且此时未加载 ViewState,我如何存储/记住用户已添加到页面的控件数量?

编辑*:

我忘了说,当用户保存时,会有一些验证,所以如果验证失败,需要显示所有的文本框,以及他们发布的数据。

4

3 回答 3

1

如果您打算在表单上只允许有限数量的文本框,您可以在 Page_Init 期间创建该数量的文本框并将它们的可见性设置为 false,这样它们就不会在浏览器中呈现。在按钮的单击事件中,您可以找到第一个不可见的文本框并将可见性更改为 true。像这样的东西

protected void Page_Init(object sender, EventArgs e)
{
    for (int i = 0; i < 20; i++)
    {
        this.Form.Controls.Add(new TextBox() { Visible = false });
    }
}

protected void addTextboxButton_Click(object sender, EventArgs e)
{
    TextBox tb = this.Form.Controls.OfType<TextBox>().FirstOrDefault(box => box.Visible == false);
    if (tb != null) tb.Visible = true;
}

使用这种方法,文本框在每次单击按钮时一个一个可见,并且回发值会保持不变。

显然,您需要在其中做更多的工作,例如定义一些文字控件来创建文本框的换行符和提示,以及在用户达到您设置的任何有限限制时显示一条消息。

于 2010-06-25T02:08:06.580 回答
0

选项 1:您可以使用 Session 来存储文本框的数量...

选项 2:您甚至可以在页面的 Load 事件中添加控件,其中您将拥有 ViewState 信息。

以下是可以帮助您的链接...

真正了解动态控制

真正理解 ViewState

于 2010-06-25T02:17:50.493 回答
0

经过一番思考,并考虑到给出的答案,想出了这个解决方案。

在控件占位符中,有一个隐藏的输入字段,它将存储添加到页面的控件数量。然后,在 Init 上,我可以使用以下代码(仅用于测试):

protected override void OnInit(EventArgs e)
{
    int i = 0;
    i = Int32.Parse(hdnTestCount.Value);

    if(Request.Params[hdnTestCount.UniqueID] != null)
    {
        i = Int32.Parse(Request.Params[hdnTestCount.UnitueID]);
    }

    for (int j = 1; j <= i; j++)
    {
         TextBox txtBox = new TextBox();
         txtBox.ID = "Test" + j.ToString();
         plhTest.Controls.Add(txtBox);
    }
}

protected void btnAdd_OnClick(object sender, EventArgs e)
{
    int i = 0;
    i = Int32.Parse(hdnTestCount.Value) + 1;

    TextBox txtBox = new TextBox();
    txtBox.ID = "Test" + i.ToString();
    plhTest.Controls.Add(txtBox);
    hdnTestCount.Value = i.ToString();
}

当然,唯一的问题是用户可以在隐藏字段中操纵该值。唯一的其他选择是使用 Session,我不想使用它,因为它会一直存在,如果以这种方式刷新页面,表单将自行重置,这是应该发生的。

于 2010-06-25T03:30:08.350 回答