1

我有一个包含生成内容的页面。

页面.aspx:

<asp:DropDownList ID="cmbUsers" runat="server" AutoPostBack="True" 
    oninit="cmbUsers_Init">
</asp:DropDownList>
<asp:Panel ID="pnlRights" runat="server">

页面.aspx.cs:

protected void Page_Load(object sender, EventArgs e)
{
    string [] roles = Roles.GetAllRoles();
    string sel_user = ... ; // get the user name selected by combo

    foreach (string role in roles)
    {
        CheckBox chk = new CheckBox();
        chk.Text = role;
        chk.Checked = Roles.IsUserInRole(sel_user, role);
        pnlRights.Controls.Add(chk);

    }
}
protected void cmbUsers_Init(object sender, EventArgs e)
{
            ... // fill the combo with user list

    if (!IsPostBack)
    {
        {
            cmbUsers.SelectedValue = // the current signed username;
        }
    }
}

在第一次加载时,页面是正确的 - 所有复选框都设置为应有的状态(选中用户所在的角色)。当您在组合中更改用户时会发生问题。在调用回发更改后,所有复选框都再次正确设置(在调试器中看到),但浏览器显示设置为前一个用户的复选框。我不怀疑浏览器错误(在 IE、Maxthon、Mozilla 中尝试过),但有些设置我忘记设置。是缓存的东西吗?请给我一些提示好吗?

4

1 回答 1

1

您每次回发都将页面重建为新状态。检查对象的IsPostBack属性Page以确保您只初始化页面一次。

protected void Page_Load(object sender, EventArgs e)
{
    if(!Page.IsPostBack)
    {
        string [] roles = Roles.GetAllRoles();
        string sel_user = ... ; // get the user name selected by combo

        foreach (string role in roles)
        {
            CheckBox chk = new CheckBox();
            chk.Text = role;
            chk.Checked = Roles.IsUserInRole(sel_user, role);
            pnlRights.Controls.Add(chk);

        }
    }
}

编辑 - 再次查看您的示例,这将无法正常工作,您应该有一个按钮或生成回发的东西,并在那里执行您的响应逻辑,而不是在 page_load 中。这就是您看到这种行为的原因。

于 2011-11-23T21:25:04.720 回答