조언을 구축을 위한 동적"고급 검색하"컨트롤 ASP.NET
문제
체 텍스트 http://img3.imageshack.us/img3/1488/advancedsearch.png
나는 건물에"고급 검색"인터페이스 ASP.NET 응용 프로그램.난 필요 없어요 그래서 이것을 쓰는 것은 나를 위해,그러나 나에 붙어 특정 문제에 관한 동적 컨트롤 ViewState.나는 어떤 방향으로 접근하는 방법에 대한 이다.여기에 내 상황:
재료:
- 수리 할 수 있는 설정의 API 개체를 나타내는 엔티티,필드를 검색하는 손잡이 구색,생성 SQL,그리고 반환하는 결과입니다.그래서 그는 모든습니다.
- ASP.NET 3.5
원하는 인터페이스 기능:
(1)이 초기 페이지 하중,인터페이스 사전 검색체 집합으로 의식체입니다.그것은 바인딩으로 그들을 설정의 컨트롤(위의 이미지를 참조하십시오.)
일부 검색 항목은 간단,다음과 같:
Field(추가 다운 목록)|운영자(추가 다운 목록)|값(TextBox)
검색 기준에 대한 컨트롤 일부 필드 형식이 중요한 저장된 정보에 viewstate,다음과 같:
Field(추가 다운 목록)|운영자(추가 다운 목록)|값(추가 다운 목록)는"Value"추가 다운 목록에 의해 채워진 데이터베이스 쿼리가 있습니다.
어떤 필드를 조회하는 다른 기관에 일으키는 원인이 되는 체인의 필드를 선택,다음과 같:
Field(추가 다운 목록)분야(추가 다운 목록)|운영자(추가 다운 목록)|값
(2)사용자 수정으로 검색:
- 추가 및 제거 검색 기준을 클릭하면 해당 버튼
- 구성하는 기존 표준에 의해 변경,현장 운영자,또는 값입니다.변화하는 분야 또는 연산자는 필요한 통제를 다시 구성 변경하여 사용할 수 있는 연산자는,변경"Value"를 입력 제어를 다른 형식 또는 추가/제거 DropDownLists 에서"분야"섹션으면 조회-입력 필드를 선택한/지는 않습니다.
(3)마지막으로,사용자가"검색"그들의 결과입니다.
문제:
당신은 아마 이미 알고있는 바와 같이 당신이 질문에 대답 컨트롤 추가에 동적으로 페이지에서 사라시오내가 생성한 정렬을 자극하는 제어 수집하고 깔끔하게 수행 단계(1)위에서 볼 수 있듯이 첨부된 이미지입니다.(나는 염려하지 않습 스타일에 대한 이 시점에서 분명합니다.)
그러나 포스트백,컨트롤은 모두 사라졌고,내 검색 API 체가 사라졌다.을 얻을 수 있다면 동적으로 생성되어 수집하는 그냥 좋은 플레이와 스틱에 ViewState,나 수 있는 검사에서 컨트롤 다시 게시 다시는 검색어를 처리하 제어 이벤트를 깔끔하게 보관할 수 있습니다.
가능한 솔루션
내가 만들 수 있는 이색체 serializable 에 저장 viewstate.다음 페이지에 적용할 수 있 그것을 잡고 재구성하 제어 컬렉션에서 페이지 로딩 시간입니다.그러나 나는 확실하지 않으면 이것은 플레이와 함께 멋지게 컨트롤이 제기 이벤트,그리고 무슨 일을 viewstate 의 드롭다운 목록에 포함하는 데이터베이스의 데이터가 그것을 다시 얻을 수 있습니까?그것은 매우 바람직하지 않은 나를 위해 다시 쿼리 데이터베이스에서 매시오
을 개발할 수 있다는 사용자 지정 제어 서버(이 링크를 참조하십시오 의)이런 종류의...하지만 그는 새로운 주제한 것을 포함 일부 학습,더 나는 완전히 확실하지 않는 경우 사용자 지정 제어 서버 작동상과 함께 멋지게 비 고정 제어 컬렉션이 있습니다.사람에 대해 알고 있는가?
었다고 생각하고 할 수 있습니다 이를 위해 사용된 컨트롤-예를 들어 내가 할 수 바인딩 나의 표준 컬렉션을 중계하는 고정되어 있어 컬렉션을(아마도 숨기기 비용"value"컨트롤을 사용하는 내용 중계기의"분야"드롭다운 목록).다음의 모든 정보는 숙박 ViewState...오른쪽?
새로운 아이디어를 주시면 감사하겠습니다.
당신의 도움을 위한 감사합니다.b.벤트
해결책
었어 코딩에 대해 일하고 이 작업을 사용하여 아름답게 세 번째 옵션을 제안에 나 질문이 세계된 제어합니다.실제로 나는 아이디어를 생각했을 때 나는 강제하기 위한 질문에 세부사항-지 않는 그냥 당신에게 일어날까?
내 SearchCriterionControl 으로 asp:리피터 바인딩을 개체의 모음입니다.필드에 대한 선택이 나는 asp:추가 다운 목록의 내부에는 중첩된 asp:리피터 바인딩된 필드 배열입니다.모든 것을 아름답게 작동,유지태,실제로 매우 작은 코드입니다.그래서 나는 결코 동적으로 컨트롤을 추가 페이지는,하느님 감사합니다.
감사에 대한 제안,청산,매트와 andrewWinn.
다른 팁
지 않기 때문에 다른 사람이 자상을 촬영에서 2 시간,나는 나의 모자에 반지와 함께 하는 솔루션에 의존하지 않 viewstate 에서는 모두(나 ASP.NET 모델의 포스트백).
당신은 무엇을 잡고 모든 입력 값으로 jQuery 고 대신 후 다시했는 게시물에 대해 페이지(또는 새로운 결과를 얻을 수 있습니다.페이지)?또는,당신은 전체 일 asyncrhonous 및 하 Ajax 요청에 대하여 웹 방법을 공급하는 결과를 채우 클라이언트 측에서 필요?
불행한 것은 여기에 당신이 재구성하는 어떤 유형의 제어하는 데 사용되었고 그림을 구성 검색 때문에 데이터를 늘 함께 전달 viewstate.그러나 나는 당신이 이미 있었다려해야 할 몇 가지 종류의 번역의 입력 데이터 쿼리로 어쨌든 형태.
읽기 기 에 대한 자세한 정보를 사용하여 jQuery 중 ASP.NET 페이지 방법입니다.기 페이지 방법은 정지 상태로 표시되어야 합니다(그것은 쉬운 감시).
나는 확실하지 않은 무슨 일을 하는 서버측 구성하는 쿼리-그러나 나는 것입 고도 추천 LINQ.았다"비슷한 고급 검색 기능"이전에,후에 몇 가지 다른 시도는 LINQ 었다위한 훌륭한 도구가 이 문제는지 여부에 관계없이었을 타격 SQL LINQtoSQL 하거나 타격 메모리 컬렉션의 객체입니다.
이 일을 너무 잘하기 때문에 1)LINQ 지연 실행을 그리고 2)LINQ 쿼리가 반환하는 다른 가능한 객체입니다.여기 암시할 수 있는 체인의 LINQ 쿼리는 당신이 함께 만들에서의 입력하는 대신 하나의 거대한 절로 번역하여 SQL 또는 무 backstore 사용(중 하나 내려고 시도했 생성 SQL 절과 문자열을,하지만 여전히 전달하는 데이터 입력을 통해 SQLParameters 에 대한 SQL injection 보호-그것은 지저분하고 복잡한 경우 손수 제작된 LINQ 었 크기 순서를 쉽게 이해하고 구현하).
예를 들어:
List<string> data; // or perhaps your a DB Context for LINQtoSQL?
var query = data.Where(item => item.contains("foo"));
if( {user supplies length search option} )
query = query.Where(item => item.Length < 5);
// etc, etc.
// LINQ doesn't do anything until the query is iterated, at which point
// it will construct the SQL statement without you worrying about details or parameter binding
foreach(string value in query)
; // do something with the results
기 때문에 이연의 실행 및 반환 가능한 입력을 연결할 수 있습 LINQ 쿼리를 이 표현은 하루 종일 그것에 대해 걱정합 구현 정보(예:로 변환하여 SQL 쿼리)에서 실행한다.
I 을 제공할 수 없습니다 당신과 함께 하는 정확한 단계를 수행해야 합니다,하지만 나는 매우 좋으로 보고 asp.net 페이지 수명 주기가 있습니다.만든 사용자 정의 컨트롤 DLL 로 한다.을 캡처 다시 게시 데이터 특정한 단계에서 수명 주기시고 다시 바인딩에서 데이터를 다른 단계가 있습니다.또한 thinkgs 다음과 같 viewstate 에서만 이용할 수 있는 특정 포인트도.내가 알고있었다는 것을 재정의 On_init,On_prerender 고 일부는 다른 방법이 있습니다.
죄송할 수 없었다 더 많은 도움이지만,그가 코드가 없는 저와(그것의 오래 된다.)도움이 되기를 바랍니다.
를 추가하는 경우 제어 컨트롤 트리 동적으로,당신을 추가해야에 postpack 니다.다만 메소드를 호출을 구성하는 컨트롤 Page_Load 또는 Page_Init 고 컨트롤 유지해야하는 페이지에서 다시 게시.