asp.net我的列表在回发时消失了 - 找不到我错过的内容?

时间:2011-08-27 20:13:09

标签: asp.net user-controls postback

这可能很简单,但我无法理解。啊...

带有自定义用户控件的C#asp.net应用程序。我的自定义控件是一个包含在链接中的简单图像列表,用作父页面的导航工具。

当我点击链接时,它会进行回发:我的点击事件似乎没有触发,当页面重新加载时,图像列表就会消失。

我在父页面和自定义控件中都有EnableViewState="true"。我的理解是,这足以保留我的选项列表?如果我每次重新加载列表并重新绑定我的事件处理程序,我会认为事件会丢失,对吗?

这是(缩写代码),我将控件添加到我的面板。

    public void LoadMediaOptions() {

      loop through a datareader {

        LinkButton b = new LinkButton();
        b.Click += new EventHandler(navOption_Click);
        b.Attributes.Add("mediaID", mediaID.ToString());

        HtmlImage i = new HtmlImage();
        i.Src = strThumbLink;
        i.Width = 120;
        i.Height = 90;
        b.Controls.Add(i);

        _loadedMediaHtml.Add(b);
        panMediaOptions.Controls.Add(b);
     }
  }

此方法目前仅在Page_Load方法的父页面中调用一次:

protected void Page_Load(object sender, EventArgs e)
{
  try
  {        
    if (!Page.IsPostBack)
      uxMediaNav.LoadMediaOptions();
  }
  catch (Exception ex)
  {
    throw ex;
  }
}

页面回发后,没有为我加载媒体选项。我对EnableViewState的理解是它会保留我动态加载的元素,但事实并非如此。

2 个答案:

答案 0 :(得分:1)

您在页面生命周期中过晚构建控件。在init之后和Load之前加载ViewState。有关页面生命周期,请参阅here

这意味着您的自定义控件无法保持任何状态,因为在发生加载状态时控件尚不存在。将您的控件结构移动到PreInit,它应该工作。

控制事件在加载后但在onLoadComplete之前触发。事件实际上在请求中传递,并与基于ID的控件匹配。如果可以通过触发时间控制事件找到控件,则事件将触发。因此,事件通常不依赖于ViewState,但更改事件除外。更改事件的确如此,因为ASP.NET需要能够将ViewState中持久保存的原始值与当前请求值进行比较,以了解是否触发事件。

要确保任何更改事件再次触发,您需要确保自定义控件中的控件是在PreInit上创建的。

答案 1 :(得分:0)

解决方案很简单:将changeControl放在Page_Load方法中。

protected void Page_Load(object sender, EventArgs e)
    {
        changeControl((UserControl)LoadControl("~/user-control.ascx"));
    }