ASP.. NET页面生命周期问题.在回发时控制Page_InitComplete中的ViewState

本文关键字:Page 控制 InitComplete ViewState 中的 NET 生命 周期 问题 ASP | 更新日期: 2023-09-27 17:50:39

我们的用户将:
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>

我目前正试图访问控件的ViewState数据在Page_InitComplete,但它似乎是空的。根据http://msdn.microsoft.com/en-us/library/ie/ms178472.aspx, ViewState在InitComplete时应该是可访问的。我需要防止防止Page_Load之前发生的一些其他动作。我如何在Page_Load之前访问控件的ViewState ?

额外学分:如果你能就如何完成整个任务提供建议,我会很感兴趣。

ASP.. NET页面生命周期问题.在回发时控制Page_InitComplete中的ViewState

您应该使用Page。预加载事件。它会在ViewState的值被加载到控件层次结构之后引发。

或者,引用msdn:

在页面加载自身和所有控件的视图状态以及处理Request实例中包含的回发数据之后引发。

我认为你没有正确阅读文档:

在页初始化期间,页上的控件可用并且设置每个控件的UniqueID属性......如果当前请求是回发时,回发数据尚未加载,控制属性值尚未恢复为视图中的值状态。

尝试Page_Load事件