我有一个包含生成内容的页面。
<asp:DropDownList ID="cmbUsers" runat="server" AutoPostBack="True"
oninit="cmbUsers_Init">
</asp:DropDownList>
<asp:Panel ID="pnlRights" runat="server">
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中试过),但有些设置我忘了设置。它是缓存的东西吗?你能给我一些提示吗?
答案 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中。这就是你看到这种行为的原因。