在帖子后面丢失DropDownList项目

时间:2014-11-19 22:19:13

标签: asp.net webforms viewstate

我有一个webforms ASPX页面,它有一个动态添加的用户控件。用户控件有两个DropDownLists,一个在UpdatePanel中,因为它的项目取决于第一个DropDownList中的选择。

问题在于,如果不更改第一个DropDownList的值,则不会保存第二个DropDownList的值。如果你确实改变了第一个DropDownList的值,那么它可以正常工作。

这就是它的简单工作方式......

首次加载页面时,会设置先前的值。这发生在主ASPX页面Page_Load事件中,其中动态添加用户控件并通过用户控件的属性设置初始值。该属性设置第一个DropDownList的选定值,触发SelectedIndexChanged事件,该事件使用基于第一个DropDownList选择的选项填充第二个DropDownList中的项,然后选择第二个DropDownList的先前值。

然后在主ASPX页面中,在PreLoad事件中的帖子后面再次动态添加用户控件。

Viewstate全程启用。

我已经调试过并且在回帖后第二个DropDownList没有Items。即使在UpdatePanel部分回发期间,项目集合也是空的。但是,如果更改了第一个DropDownList,则Items集合是正确的 - 只有在问题发生的初始加载上最后一次填充第二个DropDownList时才会这样。

这里是代码的相关部分......

非常感谢任何帮助。

ASPX页面:

protected void Page_PreLoad(object sender, EventArgs e)
{
    if (Page.IsPostBack)
    {
        PopulateTemplateOptions();
    }
}

protected void PopulateTemplateOptions(bool init = false)
{
     //this is where the control is dynamically added
     //If not post back then initial values are set by passing values to 
     //user control's TemplateOptions property
}

用户控制:

public string TemplateOptions
{
    set
    {
         //this is where the initial values are set
    }
}

protected void ddlEnquirySubjectDefault_SelectedIndexChanged(object sender, EventArgs e)
{
    //this is where items are added to the second drop down list based on the selection in the first one.
}

(这些是唯一相关的部分,但我还没有包含的另外7,000行代码。)

1 个答案:

答案 0 :(得分:0)

以下是我的两个想法:

1)您的代码中此行可能有误:if (Page.IsPostBack)

必须是if (!Page.IsPostBack),虽然我从未使用Page_PreLoad事件,所以我不确定它是否正确。

2)尝试在Page_Init事件中执行您想要的操作。我在我的项目中使用它,没有问题。