Javascript 强制asp.net页面从服务器回发
我有一个完全在代码隐藏(oh joy)中动态创建的页面 在按下此页面上的按钮时,会向页面添加更多元素-这很好,但是,刷新的页面直到下一次回发时才会显示。我将执行重定向,但我希望保留在现有控件中输入的任何数据的状态 所以-我需要强制从服务器回发代码隐藏代码。我想这需要插入一些js代码——但除此之外,我一点也不高兴 下面是一个让事情更清楚的例子:Javascript 强制asp.net页面从服务器回发,javascript,asp.net,postback,dynamic-controls,Javascript,Asp.net,Postback,Dynamic Controls,我有一个完全在代码隐藏(oh joy)中动态创建的页面 在按下此页面上的按钮时,会向页面添加更多元素-这很好,但是,刷新的页面直到下一次回发时才会显示。我将执行重定向,但我希望保留在现有控件中输入的任何数据的状态 所以-我需要强制从服务器回发代码隐藏代码。我想这需要插入一些js代码——但除此之外,我一点也不高兴 下面是一个让事情更清楚的例子: <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default2.aspx.
<%@ 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;
}
}
使用系统;
使用System.Collections.Generic;
使用System.Web;
使用System.Web.UI;
使用System.Web.UI.WebControl;
公共部分类Default2:System.Web.UI.Page
{
受保护的无效页面加载(对象发送方、事件参数e)
{
如果(!IsPostBack)
{
会话[“数据”]=1;
}
PopulatePage();
}
私有void PopulatePage()
{
int data=(int)会话[“data”];
对于(int n=0;n”;
占位符1.控件.添加(亮起);
}
}
受保护的无效按钮1\u单击(对象发送者,事件参数e)
{
int data=(int)会话[“data”];
会话[“数据”]=++数据;
}
}
单击该按钮,将添加更多控件。这比我遇到问题的页面简单得多,但它演示了我遇到的问题。使用请求表单列表搜索唯一控件ID 类似下面的链接,最后一篇文章,不确定他的代码是否完全正确,但你会明白的 为控件提供唯一ID,您可以在回发中搜索它们
另外,我还向ID添加了其他内容,以让回发搜索知道它是什么类型的控件,比如添加txt_firstname,我知道firstname是一个txtbox。使用regex搜索返回的字符串。不需要回发,而且有点像
黑客
,最好从根本上解决问题
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;
}
}
private void PopulatePage()
{
用于(int n=0;n”;
占位符1.控件.添加(亮起);
}
受保护的覆盖无效CreateChildControls()
{
PopulatePage();
base.CreateChildControls();
}
受保护的无效按钮1\u单击(对象发送者,事件参数e){
CreateSingleControl(计数器);
计数器++;
}
专用整数计数器
{
收到
{
返回计数器=(int)(视图状态[“数据”]??1);
}
设置
{
ViewState[“数据”]=值;
}
}
如果在按下按钮时运行服务器代码,则表示已经有回发。我知道,我需要生成另一个回发。按下一个按钮(第一次回拨),页面将添加另一个控件-但这在另一次回拨之前不会出现…为什么不能用第一次回拨更新页面?它在第一次回拨时更新-但是,我将详细介绍。在页面加载功能中,根据数据库填充控件。因此,按下按钮后,将填充控件(根据需要),然后更新数据库。我不能再次调用“填充”按钮,因为它会复制控件ID,除非我清除屏幕上的现有控件,然后我会丢失这些值。但在下一次回发时,数据库是最新的,页面会自行填充。我将尝试创建一个简单的示例来发布。您如何尝试使按钮单击/页面加载(以最后运行的为准,猜测按钮单击)更智能一些?如果是按钮单击,您可以为新项目创建控件(在您的示例中,再添加一个控件),如果是另一个,我看不出问题所在。这实际上似乎与问题无关。所有控件都有唯一的ID,我在需要时可以毫无问题地找到控件的值,即使它们都是动态生成的。