我需要创建以下功能,并寻找在多个回发上存储信息的最佳方式:
假设我有一个与问题相关的TextBox,即“我去过的地方”。一旦TextBox将在第一次加载时加载。在那之下,有一个“添加另一个地方”的按钮。这将回发,然后在第一个下面添加另一个TextBox。这可以做x次。
我的问题是,我如何存储/记住用户添加到页面中的控件数量,考虑到需要在Init事件中完成此加载,并且未加载ViewState点?
修改*:
我忘了提及,当用户保存时,会有一些验证,所以如果验证失败,需要显示所有TextBox,以及他们发布的数据。
答案 0 :(得分: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;
}
使用这种方法,每次点击按钮时文本框会逐一显示,并且回发值会保持不变。
显然,你想要做更多的工作,例如定义一些文字控件来创建文本框的换行符和提示,以及当用户达到你设置的任何有限限制时显示一条消息。
答案 1 :(得分:0)
选项1:您可以使用Session来存储文本框的数量......
选项2:您甚至可以在页面的Load事件中添加控件,其中您将获得ViewState信息。
以下链接可以帮助您......
答案 2 :(得分: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,我不想使用Session,因为如果页面以这种方式刷新,表单将自行重置,这就应该发生。