为什么控件会在回调数据中填充两次 - 在LoadPostBack期间和期间

时间:2009-04-17 19:45:23

标签: c# .net asp.net postback viewstate


LoadPostBack数据阶段期间使用回发数据填充控件。如果未在 OnInit 阶段创建动态控件并将其添加到控制树,但稍后,则控件将不会填充回发数据,如以下代码所示,其中 Label1 将显示一个空字符串:


public partial class _Default : System.Web.UI.Page
{
    TextBox textB;
    protected void Page_Load(object sender, EventArgs e)
    {
        textB = new TextBox();
        textB.ID = "dynamicTextC";
        Panel1.Controls.Add(textB);
        Label1.Text = textB.Text; // displays an empty string
    }


但是如果我将 Label1.Text = textB.Text; 放在订阅textB的 TextChanged事件的事件处理程序中,那么 Label1 将显示文本用户进入 textB 。现在,这表明控件使用相同的回发数据填充两次 - 在 LoadPostBack数据阶段期间和提升回发事件阶段期间。 那么为什么需要两次使用相同的回发数据填充控件呢?

顺便说一句 - 我意识到在提升回发事件阶段控制期间将回发值与之前页面加载的回发值进行比较,然后决定是否需要引发事件


    TextBox textB;
    protected void Page_Load(object sender, EventArgs e)
    {
        textB = new TextBox();
        textB.ID = "dynamicTextC";
        Panel1.Controls.Add(textB);

        textB.TextChanged += textB_TextChanged;         
    }


    protected void textB_TextChanged(object sender, EventArgs e)
    {
        Label1.Text = textB.Text; // Label1 displays value user
                                     entered into textB
    }


感谢名单


编辑:

  

控件将被创建并将成为viewstate的一部分(因为它是服务器端控件。因此,不需要在回发时再次创建)

这不是发生的事情,至少在我的情况下,TextBox在回发中消失了。

2 个答案:

答案 0 :(得分:2)

我认为你应该把这个代码放在支票

下面
if (!IsPostBack)
{
 textB = new TextBox();
 textB.ID = "dynamicTextC";
 Panel1.Controls.Add(textB)
}

编辑:控件将被创建并将成为viewstate的一部分(因为它是服务器端控件。因此,不需要在回发时再次创建)

尝试查看第一次加载页面时生成的HTML标记。下次要了解“dynamicTextC”的标记文本。

答案 1 :(得分:0)

您是否有特定原因要求您不想在Page_Init中创建动态控件?这段代码似乎有效:

  protected void Page_Init(object sender, EventArgs e) {
    textB = new TextBox();
    textB.ID = "dynamicTextC";
    Panel1.Controls.Add(textB);
  }


  protected void Page_Load(object sender, EventArgs e) {
    Label1.Text = textB.Text;
  }