回发后DropDownList为空

时间:2010-08-26 19:36:50

标签: asp.net

我正在使用ASP.NET 4.0,我在DropDownList中保存所选值时遇到问题。

我在Web Control的PreRender方法中初始化它如下:

    if (!Page.IsPostBack)
        LoadCountryList();

LoadCountryList的代码是:

private void LoadCountryList()
{
    var vr = new CountryRepository();
    var countryList = vr.GetAllForList();

    DdlCountry.EnableViewState = true;
    DdlCountry.DataValueField = "code";
    DdlCountry.DataTextField = "name";
    DdlCountry.DataSource = countryList;
    DdlCountry.DataBind();
}

在我提交表单后,我注意到DropDownList是空的(它不是在回发之前)。如果你看一下我的代码,我已经为这个控件启用了ViewState,但是我还没有得到任何结果。有人知道发生了什么吗?

修改

以下是aspx文件中控件的简单代码:

                <asp:DropDownList Runat="server" ID="DdlCountry">
                </asp:DropDownList>

4 个答案:

答案 0 :(得分:9)

如果它在prerender中,那么就是在ViewState初始化之前,所以你不是在回发上重新加载数据而你也无法从ViewState获取,因为它没有放在那里。下拉列表中最好的事情就是在回发时加载它们,但是需要一些缓存。这样你的ViewState就不会膨胀,它仍会在回发时处理你的事件,而你也不会捣毁你的数据库。

更新:

校正。 @StriplingWarrior在下面关于PreRender的评论中是正确的(它将在PreRender中加载到ViewState中)。但是,我不知道你怎么能比我的建议更简单。对于下拉列表,请执行以下操作:

  1. 在控制/页面init中加载数据(不要检查IsPostBack标志)而不是PreRender。
  2. 完成。
  3. 但是,你可以通过确保数据被缓存来改善这一点(因为每次运行你的页面/控制init时它都会被点击),但除非是高流量,否则这并不过分关注..或者至少,它需要与所有其他缓存/数据库问题一起进行评估。

    这是一个更好的解决方案(除了解决您的问题)之外的最大原因是,您的ViewState不会因为所有项目(Base64编码为启动)而不必要地膨胀,同时仍然能够跟踪下拉列表中的所选项目(关闭ViewState以获取下拉菜单,使您无法跟踪所选项目而无需直接查看表单发布值)。

答案 1 :(得分:7)

如果MasterPage的EnableViewState设置为false,我观察到了这种现象。 (VS2008)

我的解决方案是在GET和POST中填充下拉列表,并从Page_Load中的Form变量中检索SelectedValue:

if (IsPostBack)
{
    dropdown.SelectedValue = Request.Form[dropdown.UniqueID];
}

答案 2 :(得分:0)

ViewState和ASP.NET页面生命周期是奇怪的野兽。你有时必须得到正确的“时机”。尝试:

  • 在Page_Load而不是PreRender中执行此工作。只是为了幽默我。
  • 在早期启用viewstate,例如在Init上,无论页面是否为回发。当您点击InitComplete事件以便在回发时加载以前的视图状态结果时,需要启用它。
祝你好运。

答案 3 :(得分:0)

解决方案:

Set Enable View State=true