2009-12-01 1 views
2

내가 viewstate가와 F5 페이지 새로 고침 내 ASP.NET 응용 프로그램에서 문제에 봉착를로드하지 못했습니다.문제 - viewstate가

만약 내가 바로 F5를 공격 한 페이지에서 다른 페이지로 이동 한 후, 나는 다음과 같은 오류가 발생합니다 :

HttpException (0x80004005): Failed to load viewstate. The control tree 
into which viewstate is being loaded must match the control tree that 
was used to save viewstate during the previous request. 
For example, when adding controls dynamically, the controls added during a 
post-back must match the type and position of the controls added during 
the initial request.] 
System.Web.UI.Control.LoadViewStateRecursive(Object savedState) +310 
System.Web.UI.Control.LoadChildViewStateByIndex(ArrayList childState) +136 
System.Web.UI.Control.LoadViewStateRecursive(Object savedState) +224 
System.Web.UI.Control.LoadChildViewStateByIndex(ArrayList childState) +136 
System.Web.UI.Control.LoadViewStateRecursive(Object savedState) +224 
System.Web.UI.Control.LoadChildViewStateByIndex(ArrayList childState) +136 
System.Web.UI.Control.LoadViewStateRecursive(Object savedState) +224 
System.Web.UI.Control.LoadChildViewStateByIndex(ArrayList childState) +136 
System.Web.UI.Control.LoadViewStateRecursive(Object savedState) +224 
System.Web.UI.Control.LoadChildViewStateByIndex(ArrayList childState) +136 
System.Web.UI.Control.LoadViewStateRecursive(Object savedState) +224 
System.Web.UI.Page.LoadAllState() +439 
System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +1092 

점 :

System.InvalidCastException 
"Unable to cast object of type 'System.Web.UI.Triplet' 
to type 'System.Web.UI.Pair'." 

이 페이지에 표시되는 다음과 같은 예외로 연결 실패한 상위 LoadViewState를 호출 할 때 사용자 정의 레이블 컨트롤에 대한 Overloaded LoadViewState 메서드에 있습니다.

System.Web.UI.WebControls.Label.LoadViewState(ByVal savedState As Object) 

savedState 객체 대신 라벨 제어에 의해 예상 System.UI.Pair 오브젝트 중, System.Web.UI.Triplet 인 완전히 다른 제어 (드롭 다운리스트)이 될 것으로 보인다.

내가 같은 응용 프로그램에서 다른 페이지를 사용하여 정확히 같은 일을 할 경우, F5 다시 게시 후 좋은 페이지가로드. 두 웹 페이지는 동일한 기본 클래스에서 상속되며 동일한 사용자 지정 컨트롤을 사용합니다. 문제를 일으키는 페이지에는 동적으로 추가 된 컨트롤이 없습니다. LoadViewState 이벤트가 성공적으로로드 페이지에서 컨트롤에 대한 F5 다시 게시 후 해고되지 않는 것처럼

그것은 보이는 프로세스를 디버깅 가졌어요. SaveViewState는 두 경우 모두에서 실행됩니다.

어떤 아이디어 왜 LoadViewState 이벤트는 다른 한 페이지 해고가 아닌 것? 필자는 ASP.NET을 처음 접했을뿐 아니라 ViewState의 작동 방식에 대해서도 여전히 머리를 쓰고 있습니다.

답변

1

코드를 보지 않고도 말하기가 어렵습니다. 그러나 도움이 될 몇 가지 :

    당신은 피들러 같은 웹 디버거를 사용하여 실패시 HTTP 교환을보고 할 수 있습니다
  1. ; 응답이 너에게 뛰어 내릴 좋은 기회가있다.
  2. F5가 마지막 요청을 다시 보냅니다. 한 페이지에서 다른 페이지로 이동하는 경우 교차 페이지 게시를하지 않는 한 ViewState가 전혀 없어야합니다.
  3. ViewState가 요청과 함께 전송되지 않으면 오류의 특성이 인코딩하는 방식과 관련이 있습니까?
  4. 들어오는 요청에 연결된 컨트롤에로드해야하는 ViewState가 들어있는 경우에만 LoadViewState()를 호출해야합니다.
  5. SaveViewState은()가 다시 게시하는 동안 사용할 수 있도록 페이지에 숨겨진 필드에서 컨트롤의 상태를 유지하기 위해, 모든 페이지 요청에 대해 호출됩니다.