2012-11-23 3 views
3

WebControl을 확장하는 사용자 지정 컨트롤을 만들고 있습니다.웹 사용자 지정 컨트롤 데이터를 저장할 위치

<Custom:CustomGrid> 
<Columns> 
    <Custom:DataColumn HeaderText="FirstName" /> 
    <Custom:DataColumn HeaderText="LastName" /> 
</Columns> 

을하고 데이터 소스 속성에 IEnumerable을 넣어이 테이블에 밖으로 렌더링 :이 웹 컨트롤은 소비자가 같은 마크 업의 열 수집, 뭔가를 정의 할 수 있습니다. 이 컨트롤은 또한 페이징을 허용합니다. DataSource의 IEnumerable은 전체 목록이며 한 번에 목록의 페이지를 표시합니다. viewstate에 이미 현재 페이지, 페이지 당 행 수 등을 저장하고 있습니다. viewstate에 전체 목록을 추가해야합니까? 어쩌면 세션? 이 목록은 약간 무거울 수 있습니다. 아마 viewstate에 저장된 무작위 키로 세션에 저장하겠습니까? 가장 좋은 방법은 무엇입니까?

편집 : IEnumerable의 모든 유형을 직렬화 할 수 있다고 생각하지 않습니다. 그게 공평하니? 그래서 직렬화를 위해 데이터 소스를 다른 데이터 구조로 복사해야합니까?

편집 2 : 내가 대신 난을 CreateChildControls를 구현해야합니다 RenderChildControls을 구현하는 기본 컨트롤을 사용하지,하지만 난 아직도 어딘가에 데이터를 유지해야합니다, 또는 내가 기본 클래스의 포인트를 놓치지 않았더라도?

답변

2

실제로 모든 IEnumerable 인스턴스가 직렬화 될 수있는 것은 아닙니다.

쿼리를 실행하는 것이 경제적 인 경우 전체 데이터 세트를 유지하지 않고 다른 페이지 또는 쿼리 순서를 변경하기 위해 쿼리를 다시 실행하십시오.

데이터를 viewstate에 넣으면 거대한 페이지로 끝납니다. 사용자가 많지 않은 경우 세션 상태가 허용되지만 많은 사용자가있는 대용량 데이터 세트는 확장되지 않습니다. 백만 행을 사용자 컨트롤에 바인딩하면 어떻게됩니까? 또는 리피터에서 컨트롤을 사용하고 페이지에 100 번 표시된 경우 어떻게됩니까?

데이터를 유지해야합니까? 이것은 조숙 한 최적화가 아닌가?

컨트롤이 UI 구성 요소임을 기억하십시오. viewstate는 UI 상태를 그대로 유지할 수있는 충분한 정보를 보유해야합니다. 상태 변경 (예 : 다른 결과 페이지로 전환)은 귀하의 컨트롤이 책임을 데이터 소스로 전달해야하는 대상입니다.

좋은 오래된 GridView을보십시오. 그것은 당신이 무엇을주고 그것을 기억하는지 보여줍니다.페이징을 사용하는 경우 "사용자가 페이지를 변경했으며 페이지 x 개의 데이터를 제공합니다"라는 이벤트가 발생합니다. 저에게는 이것이 UI 컨트롤을위한 최선의 방법입니다.

+0

그게 내가 결국하는 일입니다. 데이터 세트가 그리 크지 않기 때문에 필자는 각 포스트 백에서 DataSource 속성을 소비 페이지로 설정하는 책임을지고 ViewState에 이전에 DataSource를 가져 오는 데 필요한 항목 만 저장합니다. –

0

데이터 바인딩 된 컨트롤을 구현하려면 해당 작업을 수행하도록 설계된 기본 클래스를 사용하는 것이 좋습니다. 예를 들어, ASP.NET에는 CompositeDataboundControl이 있습니다.이 클래스는 사용자 정의 데이터 바운드 컨트롤을 구현하는 기본 클래스로 사용할 수 있습니다. 다음과 같은 Dino Esposito 문서를 검토하는 데 도움이 될 수 있습니다. http://msdn.microsoft.com/en-us/library/aa479016.aspx.

기본적으로 ASP.NET gridview와 같은 컨트롤을 만들면 viewstate에 값이 저장됩니다. 더 명확히하기 위해 viewstate에 할당 된 값을 저장하는 DataRow 컨트롤을 만듭니다. 다시 게시하는 동안 동일한 수의 행을 다시 만들고 viewstate에서 값이 복원됩니다. viewstate를 사용하지 않고 세션에서 예를 들어 데이터 소스 만 저장하면 모든 포스트 백 동안 데이터를 그리드에 다시 바인딩해야합니다. 따라서 GridView와 비슷한 서버 컨트롤을 만들면 Dino Esposito 게시물에 설명 된 접근 방식이 ASP.NET Server GridView 컨트롤과 유사한 컨트롤을 만드는 방법을 보여주기 때문에 매우 유용합니다.

+0

대부분의 컨트롤은 수동으로 렌더링되며 순수한 HTML이며 서버 컨트롤은 아닙니다. 따라서 컨트롤에 자신의 viewstate를 유지할 수는 없습니다. –