【发布时间】:2011-06-09 18:01:30
【问题描述】:
我有一个完全在后面的代码中动态创建的页面(天哪)。
按下此页面上的按钮时,会向页面添加更多元素 - 这很好,但是刷新的页面直到下一次回发才会出现。我会做一个重定向,但我想保留在现有控件中输入的任何数据的状态。
所以 - 我需要从代码后面的服务器代码强制回发。我想这涉及到插入一些 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;
}
}
您单击按钮并添加更多控件。这方式比我遇到问题的页面简单,但它展示了我遇到的问题。
【问题讨论】:
-
如果您在按下按钮时运行服务器代码,则意味着已经有 回发。
-
我知道,我需要生成另一个回发。按下一个按钮(第一次回发),页面会添加另一个控件 - 但这在另一个回发之前不会出现......
-
为什么不能只用第一个回调更新页面?
-
它在第一次回调时更新 - 但是,我会更详细地介绍。在页面加载功能中,控件根据数据库进行填充。因此,在按下按钮时,控件会被填充(根据需要),然后数据库会更新。我不能再次调用填充按钮,因为它会复制控件 ID,除非我从屏幕上清除现有控件 - 然后我会丢失这些值。但是在下一次回发时,数据库是最新的,并且页面会自行填充。我将尝试创建一个简单的示例来发布。
-
您如何尝试使 button1_click/page_load(无论哪个最后运行,猜测 button1_click)更智能一点?如果是 button1_Click 您可以为新项目创建控件(在您的示例中再添加 1 个控件),如果是另一个,我真的看不出问题。
标签: javascript asp.net postback dynamic-controls