【问题标题】:ASP.NET page life cycle issue. Control ViewState in Page_InitComplete on postbackASP.NET 页面生命周期问题。在回发时控制 Page_InitComplete 中的 ViewState
【发布时间】:2013-01-04 20:52:54
【问题描述】:

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

额外积分:如果您想就如何完成我感兴趣的整体任务提供建议。

【问题讨论】:

    标签: c# asp.net viewstate page-lifecycle


    【解决方案1】:

    您应该使用 Page.PreLoad 事件。它是在 ViewState 中的值加载到控件层次结构后引发的。

    或者,引用 msdn:

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

    【讨论】:

    • 可以从 Page_PreLoad 访问视图状态。我变得专注,应该继续前进。
    【解决方案2】:

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

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

    试试 Page_Load 事件。

    【讨论】:

    • 在 InitComplete 部分中声明视图状态更改的跟踪在 InitComplete 之前打开。 "视图状态跟踪使控件能够保留以编程方式添加到 ViewState 集合的任何值"
    猜你喜欢
    • 2011-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多