ASP.Net:자리 표시자에 동적으로 추가된 사용자 컨트롤은 값을 검색할 수 없습니다.

StackOverflow https://stackoverflow.com/questions/102483

  •  01-07-2019
  •  | 
  •  

문제

PlaceHolder 서버 컨트롤에 일부 사용자 컨트롤을 동적으로 추가하고 있습니다.내 사용자 컨트롤은 일부 레이블과 일부 텍스트 상자 컨트롤로 구성됩니다.

양식을 제출하고 서버의 텍스트 상자(각 사용자 컨트롤 내) 내용을 보려고 하면 비어 있습니다.

포스트백이 완료되면 텍스트 상자에는 포스트백 전에 입력한 데이터가 포함됩니다.이는 상자의 텍스트가 ViewState를 통해 유지되고 있음을 알려줍니다.디버깅할 때 왜 찾을 수 없는지 모르겠습니다.

사용자가 서버에 입력한 데이터가 왜 표시되지 않는지 알려주실 수 있나요?

도움을 주셔서 감사합니다.

도움이 되었습니까?

해결책

이는 .NET v1 이벤트 시퀀스를 기반으로 하지만 다음과 같은 아이디어를 제공해야 합니다.

  • 초기화(초기화 이벤트)
  • 추적 보기 상태 시작(포스트백 여부 확인)
    • 뷰 상태 로드(포스트백인 경우)
    • 포스트백 데이터 로드(포스트백인 경우)
  • 로드(로드 이벤트)
    • 변경된 이벤트 발생(포스트백인 경우)
    • 포스트백 이벤트 발생(포스트백인 경우)
  • PreRender(PreRender 이벤트)
  • 뷰 상태 저장
  • 세우다
  • 언로드(언로드 이벤트)
  • 폐기하다

보시다시피 ViewState 데이터를 컨트롤로 다시 로드하는 작업은 Load 이벤트 이전에 발생합니다.따라서 동적으로 추가된 컨트롤이 해당 값을 "유지"하려면 다음과 같아야 합니다. 현재의 ASP.NET 페이지에서 처음에 값을 다시 로드합니다.뷰 상태 로드가 발생하기 전에 초기화 단계에서 해당 컨트롤을 다시 만들어야 합니다.

다른 팁

나는 어제 loadviewstateevent가 발생한 직후에 컨트롤 트리를 로드하여 실제로 앱이 정상적으로 작동하도록 할 수 있다는 것을 알아냈습니다.loadviewstate 이벤트를 재정의하는 경우 mybase.loadviewstate를 호출한 다음 자체 코드를 삽입하여 바로 뒤에 컨트롤을 재생성하면 페이지 로드 시 해당 컨트롤의 값을 사용할 수 있습니다.내 앱 중 하나에서는 viewstate 필드를 사용하여 해당 컨트롤을 다시 만드는 데 사용할 수 있는 ID 또는 배열 정보를 보유합니다.

Protected Overrides Sub LoadViewState(ByVal savedState As Object)
    MyBase.LoadViewState(savedState)
    If IsPostBack Then
        CreateMyControls()
    End If
End Sub

페이지 수명 주기의 초기화 단계에서 PlaceHolder에 UserControl을 추가해야 로드 단계에서 ViewState가 채워져 해당 값을 읽을 수 있다고 생각합니다.이것이 로드하는 순서인가요?

클래스 수준에서 동적 컨트롤을 정의하고 ASP 컨테이너에 추가하는지 확인하세요.

Private dynControl As ASP.MyNamespace_MyControl_ascx

그리고 컨트롤을 인스턴스화할 때 개체가 올바르게 추가되도록 LoadControl을 호출해야 합니다.

dynControl = CType(LoadControl("~/MyNamespace/MyControl/MyControl.ascx"), ASP.MyNamespace_MyControl_ascx)

Page_PreInit 이벤트 처리기에서 컨트롤을 만들어야 합니다.ASP.NET 서버 제어 모델은 까다롭습니다.내용을 완전히 이해해야 합니다. 페이지 수명주기 제대로 하려면.

다른 사람들이 말했듯이, viewstate가 생성되기 전에 모든 형태의 제어 조작이 완료되어야 합니다.

다음은 도움이 되는 페이지 수명 주기에 대한 좋은 링크입니다.

http://msdn.microsoft.com/en-us/library/ms178472.aspx

우리는 동일한 일을 경험했으며 정확히 동일한 .ID를 가진 page_load의 고스트 컨트롤을 사용하여 이를 처리한 다음 포스트백이 이벤트와 데이터를 선택합니다.다른 사람들이 말했듯이 상태가 이미 구축되고 이후에 추가된 컨트롤이 저장되지 않는 것은 초기화 단계 후에 컨트롤을 동적으로 추가하는 것입니다.

이것이 조금 도움이 되기를 바랍니다.

또한 런타임에 Control.ID 속성을 설정하기만 하면 사용자 컨트롤이 예상대로 작동하는 것을 본 적이 있다는 점을 덧붙이고 싶습니다.ID를 설정하지 않으면 아이템이 다른 순서로 빌드되어 이상하게 작동할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top