ASP.NET:即使在更改后,页面也会在Post-back上进行更改而不进行更改

时间:2011-11-23 21:22:44

标签: asp.net caching checkbox postback user-generated-content

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

Page.aspx:

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

Page.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中试过),但有些设置我忘了设置。它是缓存的东西吗?你能给我一些提示吗?

1 个答案:

答案 0 :(得分: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中。这就是你看到这种行为的原因。