【问题标题】:Why is my DropDownList empty on Postback?为什么我的 DropDownList 在回发时为空?
【发布时间】:2011-11-23 09:37:17
【问题描述】:

我已经查看了一些类似问题的答案,但我似乎仍然无法弄清楚这一点。我想我误解了 ASP.NET 的工作原理。

在标准的 ASP.Net 4.0“创建新帐户”表单中,我添加了一个 DropDownList,其中包含要为新帐户选择的角色。在 aspx 页面中,控件如下所示:

<asp:DropDownList ID="RoleList" Width="100px" runat="server"></asp:DropDownList>

然后我在 Page_Load 事件中填充列表:

protected void Page_Load(object sender, EventArgs e)
    {
        RegisterUser.ContinueDestinationPageUrl = Request.QueryString["ReturnUrl"];

        if (Page.IsPostBack)
        {
            return;
        }

        //Set the Role List Selections
        DropDownList roleList = (DropDownList)RegisterUser.CreateUserStep.ContentTemplateContainer.FindControl("RoleList");

        //set the role list
        String[] roles = Roles.GetAllRoles();
        foreach (String role in roles)
        {
            roleList.Items.Add(new ListItem(role, role));
        }
    }

我可以从生成的 html 中查看/选择一个角色。单击创建用户的“提交”按钮时会出现问题:

protected void RegisterUser_CreatedUser(object sender, EventArgs e)
    {
        FormsAuthentication.SetAuthCookie(RegisterUser.UserName, false /* createPersistentCookie */);

        string continueUrl = RegisterUser.ContinueDestinationPageUrl;
        if (String.IsNullOrEmpty(continueUrl))
        {
            continueUrl = "~/";
        }

        //set user role
        DropDownList roleList = (DropDownList)RegisterUser.CreateUserStep.ContentTemplateContainer.FindControl("RoleList");
        Roles.AddUserToRole(RegisterUser.UserName, roleList.SelectedValue);

        Response.Redirect(continueUrl);
    }

这里,roleList 对象包含零个项目,并且没有选定的值。不知何故,我在选择项目和提交之间丢失了填充项目。知道我做错了什么吗?

【问题讨论】:

    标签: asp.net drop-down-menu


    【解决方案1】:

    将您的下拉列表加载到 OnInit 函数中 - 然后它应该在调用 RegisterUser_CreatedUser 时正确加载:

    protected override void OnInit(EventArgs e)
    {
        base.OnInit(e);
    
        //Set the Role List Selections
        DropDownList roleList = (DropDownList)RegisterUser.CreateUserStep.ContentTemplateContainer.FindControl("RoleList");
    
        //set the role list
        String[] roles = Roles.GetAllRoles();
        foreach (String role in roles)
        {
            roleList.Items.Add(new ListItem(role, role));
        }
    }
    

    【讨论】:

    • 就是这样!谢谢,现在我只需要了解原因。
    • @SP - OnInit 发生在 Asp.Net 将值从表单加载到其对象之前。 Page_Load 发生在 Load 事件期间,该事件发生在询问表单之后。查看此页面以了解 Asp.Net 中的页面事件:msdn.microsoft.com/en-us/library/ms178472.aspx
    • 我阅读了该页面,但我仍然不明白为什么我的原始代码无法正常工作。为什么 DropDown 中的 Items 会消失?
    • @SP - 它们消失是因为它们没有加载。您的代码告诉 Page_Load 在有机会运行该代码之前返回(意味着它离开函数)。您需要记住,网络基本上是无状态的,因此如果您希望在页面上显示某些内容,则需要在每次请求该页面时都这样做。
    • 这对我来说就像一个魅力。谢谢@Charles Boyung。你为我节省了大量时间!
    【解决方案2】:

    我有一个类似的问题,单选按钮选择的更改会自动回发页面,并且页面返回后下拉列表项会消失。

    解决方案

    检查 IIS -> 您的网站 -> 页面和控件 -> 启用视图状态和启用会话状态应设置为 true。

    希望这会有所帮助。

    【讨论】:

      【解决方案3】:

      下面的代码在页面加载时绕过了正确的数据绑定。

      if (Page.IsPostBack) 
      { 
          return; 
      }
      

      您需要每次都绑定此控件,以便在调用单击事件时显示值。对不再存在的选定项目进行操作时,您还可能会遇到事件错误。

      【讨论】:

      • 但如果我这样做,所选索引将始终为 0,因为它在单击提交后重新填充,但在调用 RegisterUser_CreatedUser 之前。
      【解决方案4】:

      您是否尝试在以下条件下使用您的绑定?

      if (!Page.IsPostBack)  
      {  
          //Binding goes here
      }
      

      【讨论】:

      • @SP - 没错,但是 ncakmak 的格式是做这种事情的更标准的方式,所以你可能想要以这种格式做事情,以便其他人更容易理解你的代码。跨度>
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-24
      相关资源
      最近更新 更多