1

生成されたコンテンツを含むページがあります。

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で試した)は疑わないが、設定を忘れた設定がある。キャッシングのあるものですか?ヒントを教えてください。

4

1 に答える 1

1

ポストバックごとにページを新しい状態に再構築します。IsPostBackオブジェクトのプロパティをチェックしてPage、ページを1回だけ初期化するようにします。

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 に答える