【问题标题】:DropDownList empty after postback回发后 DropDownList 为空
【发布时间】:2010-08-26 19:36:50
【问题描述】:

我正在使用 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>

【问题讨论】:

  • DDL 是动态添加的,还是在 ASPX 中声明性的?
  • 尝试将 enableviewstate="true" 放入标记而不是代码中。只是预感,我可能是错的......(我假设你在 @page 指令中有 enableviewstate="false",对吧?)
  • 在哪里?我不知道去哪里找。
  • @Brian:三重检查是否没有代码重置下拉列表并且您不知道
  • 没有,因为我已经创建了。

标签: asp.net


【解决方案1】:

如果它处于预渲染中,那么那是在 ViewState 初始化之前,因此您不会在回发时重新加载数据,并且您也无法从 ViewState 获取,因为它没有放在那里。下拉列表最好的事情是即使在回发时也可以加载它们,但会涉及一些缓存。这样一来,您的 ViewState 就不会臃肿,它仍然会在回发时处理您的事件,而且您不会敲击数据库。

更新:

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

  1. 在控件/页面初始化中加载数据(不要检查 IsPostBack 标志)而不是 PreRender。
  2. 完成。

但是,您可以通过确保缓存数据来改进这一点(因为现在每次运行页面/控件初始化时都会命中它),但除非它是高流量,否则这并不过分担心......或至少,它需要与所有其他缓存/数据库问题一起评估。

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

【讨论】:

  • 我很欣赏你的建议,但我想解决方案一定比这更简单。
  • 我相信 PreRender 通常发生在 ViewState 的生命周期中。
  • 更正。 StriplingWarrior 关于 PreRender 是正确的(它会在 PreRender 中加载到 ViewState 中)。但是,我看不出你怎么能比我的建议更简单:对于下拉菜单,请执行以下操作: 1. 在控件/页面初始化中加载数据(不要检查 IsPostBack 标志)而不是 PreRender。 2. 完成。但是,您可以通过确保您的数据被缓存来改善这一点,但除非它是高流量,否则这并不过分担心......或者至少,它符合您所有其他缓存问题。
  • 这对泰德有效!请使用此信息编辑您的解决方案,我会将其标记为解决方案。
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

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

    • 在 Page_Load 而不是 PreRender 中执行这项工作。只是为了逗我开心。
    • 在较早的时间启用视图状态,例如在初始化时,无论页面是否为回发。当您点击 InitComplete 事件时需要启用它,以便在回发时加载以前的视图状态结果。

    祝你好运。

    【讨论】:

      【解决方案4】:

      解决方案:

      Set Enable View State=true
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-01-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多