我有一个完全动态创建的页面(哦欢乐)。
按下此页面上的按钮,会向页面添加更多元素 - 这很好,但是,刷新的页面在下一次回发之前不会出现。我会进行重定向,但我想保留现有控件中输入的任何数据的状态。
所以 - 我需要从代码后面的服务器代码强制回发。我想这会涉及插入一些js代码 - 但除此之外,我根本没有任何快乐。
这是一个让事情更清晰的例子:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default2.aspx.cs" Inherits="Default2" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:Button ID="Button1" runat="server" Text="Button" onclick="Button1_Click" />
<asp:PlaceHolder ID="PlaceHolder1" runat="server"></asp:PlaceHolder>
</div>
</form>
</body>
</html>
一个非常简单的页面。
背后的代码也很简单:
using System;
using System.Collections.Generic;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
public partial class Default2 : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
Session["data"] = 1;
}
PopulatePage();
}
private void PopulatePage()
{
int data = (int)Session["data"];
for (int n = 0; n < data; ++n)
{
TextBox tb = new TextBox();
tb.ID = n.ToString();
PlaceHolder1.Controls.Add(tb);
Literal lit = new Literal();
lit.Text = "<br/>";
PlaceHolder1.Controls.Add(lit);
}
}
protected void Button1_Click(object sender, EventArgs e)
{
int data = (int)Session["data"];
Session["data"] = ++data;
}
}
单击该按钮可添加更多控件。这是方式比我遇到问题的页面更简单,但它展示了我遇到的问题。
答案 0 :(得分:0)
不需要回发,并且有点hack
,你最好在根目录修复问题。
private void PopulatePage()
{
for (int n = 0; n < Counter; n++)
{
CreateSingleControl(n);
}
}
private void CreateSingleControl(int index)
{
TextBox tb = new TextBox();
tb.ID = String.Format("text{0}", index);
PlaceHolder1.Controls.Add(tb);
Literal lit = new Literal();
lit.Text = "<br/>";
PlaceHolder1.Controls.Add(lit);
}
protected override void CreateChildControls()
{
PopulatePage();
base.CreateChildControls();
}
protected void Button1_Click(object sender, EventArgs e) {
CreateSingleControl(Counter);
Counter++;
}
private int Counter
{
get
{
return Counter = (int)(ViewState["data"] ?? 1);
}
set
{
ViewState["data"] = value;
}
}
答案 1 :(得分:-1)
使用“请求表单”列表搜索唯一控件ID 下面这个链接,最后一篇文章,不确定他的代码是完全正确的,但你会明白的。
Searching for controls in Request.Form / Parsing a NameValueCollection
为您的控件提供唯一ID',您可以在回发中搜索它们。
另外,我使用其他内容添加到ID中,让回发搜索知道它是什么类型的控件,比如添加txt_firstname,我知道firstname是一个txtbox。使用正则表达式搜索返回的字符串。