2013-01-04 1 views
0

우리의 사용자 :
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에 액세스 할 수 있습니까?

추가 크레딧 : 전반적인 작업을 수행하는 방법에 대한 제안을 보내시겠습니까?

답변

1

Page.PreLoad 이벤트를 사용해야합니다. ViewState의 값이 컨트롤 계층에로드 된 후에 발생합니다.

또는, 인용 MSDN합니다 : 페이지가로드 한 후 제기

자신과 모든 컨트롤에 대한 상태를 확인하고, 이후는 요청 인스턴스에 포함 된 포스트 백 데이터를 처리합니다.

+0

Viewstate는 Page_PreLoad에서 액세스 할 수 있습니다. 나는 고착되었고 앞으로 나아 갔어야했다. – user1161495

1

내가 제대로 설명서를 읽고 생각하지 않는다 : 페이지 초기화하는 동안

를 페이지의 컨트롤이 가능하며, 현재 요청 인 경우 각 컨트롤의 UniqueID 속성은 ...... 설정 포스트 백 포스트 백, 포스트 백 데이터가 아직로드되지 않았으며 컨트롤 속성 값이 상태의 값으로 복원되지 않았습니다.

Page_Load 이벤트를 사용해보십시오.

+0

InitComplete 섹션에서는 InitComplete 이전에보기 상태 변경 사항 추적이 설정되어 있음을 나타냅니다. "상태 추적보기를 사용하면 컨트롤에서 프로그래밍 방식으로 ViewState 컬렉션에 추가 된 모든 값을 유지할 수 있습니다." – user1161495