우리의 사용자 :
1.open 하나의 탭이 일부 작업을
2.open 다른 탭의 변화 고객 ID를 수행하고 이전 탭으로 다른 작업을
3.return을하고 계속 시도 이전 customerId
세션 상태가 새 customerId를 포함하도록 변경되었습니다. 나는 customerId가 변경되었는지 확인하고 어떤 ID를 계속하기를 원하는지를 사용자에게 알려주는 컨트롤을 만들고있다.ASP.NET 페이지 수명주기 문제. 포스트 백에 Page_InitComplete에서 컨트롤의 ViewState 것
코드 나는 현재 Page_InitComplete에서 컨트롤의 ViewState에 데이터에 액세스하려고하지만이 비어있는 것으로 나타납니다
<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>
ASCX
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);
}
}
}
뒤에.
http://msdn.microsoft.com/en-us/library/ie/ms178472.aspx에 따르면 InitComplete에있을 때 ViewState에 액세스 할 수 있어야합니다. Page_Load 전에 다른 동작이 일어나지 않도록 방지해야합니다. 어떻게 포스트 백퍼 페이지 Load에서 컨트롤 ViewState에 액세스 할 수 있습니까?
추가 크레딧 : 전반적인 작업을 수행하는 방법에 대한 제안을 보내시겠습니까?
Viewstate는 Page_PreLoad에서 액세스 할 수 있습니다. 나는 고착되었고 앞으로 나아 갔어야했다. – user1161495