0


1. 1 つのタブを開いていくつかのタスクを実行する
2. 別のタブを開いて customerId を変更し、他のタスクを実行する
3. 前のタブに戻り、古い customerId で続行しようとする
セッション状態が変更され、新しい customerId が含まれるようになります. 私は、customerId が変更されたことを確認し、どの Id を続行したいかをユーザーに確認するコントロールに取り組んでいます。

コードビハインド

public partial class CustomerChanged : System.Web.UI.UserControl
{
    protected override void OnInit(EventArgs e)
    {
        base.OnInit(e);
        this.Page.InitComplete += Page_InitComplete;
    }

    void Page_InitComplete(object sender, EventArgs e)
    {
        if (IsPostBack)
        {
            if (Convert.ToInt32(ViewState["CustID"]) != Globals.CurrentCust.CustId)
            {
                CustomValidator err = new CustomValidator();
                err.ValidationGroup = "CustomerChanged";
                err.IsValid = false;
                err.ErrorMessage = "The customer has changed.";
                Page.Validators.Add(err);
                btnOldCustId.Text = "Old CustID \n" + ViewState["CustID"].ToString();
                btnNewCustId.Text = "New CustID \n" + Globals.CurrentCust.CustId.ToString();
                btnOldCustId.OnClientClick = string.Format("return changeCustomer({0},'{1}');", ViewState["CustID"].ToString(), Globals.GeneralSiteUrl);
                ScriptManager.RegisterStartupScript(this, this.GetType(), "CustomerChangedModalDialog", "ShowCustomerChangedModalDialog();", true);
            }
        }
    }

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            ViewState.Add("CustID", Globals.CurrentCust.CustId);
        }
    }
    protected void btnNewCustId_Click(object sender, EventArgs e)
    {
        Response.Redirect(Request.RawUrl);
    }
 }
}

ascx

<script type="text/javascript">
    function ShowCustomerChangedModalDialog() {
       var dlg = $("#CustomerChangedModal").dialog({
         title: 'Select Customer ID',
         resizable: false,
         modal: true
       });
    dlg.parent().appendTo(jQuery("form:first"));
    };

    function changeCustomer(customerId, baseUrl) {
        $.ajax({ url: "/General/Accounts/change.account?id=" + customerId + "&admin=false", async: false });
        $("#CustomerChangedModal").dialog('close');
        return false;
    }
</script>  

<div id="CustomerChangedModal" style="width: 440px; height: 250px; overflow: auto; display: none;">
    The session information has changed.
    Which account ID do you wish to use?
    <br />
    <br />
    <asp:Button ID="btnNewCustId" runat="server" OnClick="btnNewCustId_Click" />
    <asp:Button ID="btnOldCustId" runat="server" />
</div>

現在、Page_InitComplete でコントロールの ViewState データにアクセスしようとしていますが、空のようです。http://msdn.microsoft.com/en-us/library/ie/ms178472.aspxによると、InitComplete のときに ViewState にアクセスできるはずです。Page_Load の前に他のアクションが発生するのを防ぐ必要があります。Page_Load の前にポストバックでコントロールの ViewState にアクセスするにはどうすればよいですか?

追加クレジット: 全体的なタスクを達成する方法について提案を提供したい場合は、私は興味があります.

4

2 に答える 2

1

ドキュメントを正しく読んでいないと思います。

ページの初期化中に、ページ上のコントロールが使用可能になり、各コントロールのUniqueIDプロパティが設定されます......現在のリクエストがポストバックの場合、ポストバックデータはまだ読み込まれておらず、コントロールプロパティの値は値に復元されていませんビューステートから。

Page_Loadイベントを試してください。

于 2013-01-04T20:55:53.343 に答える
1

Page.PreLoad イベントを使用する必要があります。ViewState からの値がコントロール階層に読み込まれた後に発生します。

または、msdn を引用するには:

ページがそれ自体とすべてのコントロールのビュー ステートを読み込んだ後、Request インスタンスに含まれるポストバック データを処理した後に発生します。

于 2013-01-04T21:05:27.560 に答える