2010-04-26 3 views
0

현재 VS2008 SP1의 동적 데이터 엔터티 웹 응용 프로그램 프로젝트 유형을 실험하고 있으며 문제에 대한 유용한 조언을 제공하는 많은 자습서를 읽은 후 지금까지는 해결책이 필요하지 않습니다. 나는 첫 번째 장애물에 빠졌습니다.동적 데이터 엔터티 웹 응용 프로그램에서 필터 표시 중지

DB에서 필자는 엔터티 모델을 만들었으므로이 작은 테이블에 대해 만족스런 모양으로 디스플레이를 조정할 수 있는지 확인하기 위해 "Companies"라는 테이블을 작게 만들기로 결정했습니다. 회사 테이블에는 "연락처"테이블의 다양한 연락처 정보로 채워지는 레코드로 연결되는 "contactid"라는 열이 있습니다.

기본 생성 된 엔터티 데이터 모델에서는 한 회사에서 여러 연락처 레코드를 가질 수 있다고 추측했습니다. 따라서 도움이되고 "연락처 이름"필드에 의해 인덱싱 된 특정 연락처 정보 집합을 공유하는 모든 회사를 볼 수있는 "연락처"필터를 페이지에 추가합니다.

불행히도 연락처 테이블은 고객을위한 연락처 정보를 저장하는 다용도 테이블이며 회사보다 약 1000 배 많은 고객이 있습니다. 따라서 드롭 다운을 사용하면 페이지로드 시간이 기하 급수적으로 늘어나므로 아무런 이점이 없습니다.

그래서 필터가 나타나지 않게하고 싶습니다. 문제는 내가 그것을 끄는 데 단서가 없다는 것입니다. 구글은 지금까지이 문제에 대해 난처함을 증명해 왔기 때문에 아무도 쓸모없는 필터를 제거하는 방법을 알고 있는지 궁금해했다.

답변

1

최근에 같은 문제가있었습니다. 동적 데이터 응용 프로그램 템플릿을 처음 사용하고 즉시 사용 가능한 기능에 깊은 인상을 받았습니다. 그러나 나는 특히 당신이 언급 한 몇 개의 세트 백을 주목했다. 내 페이지 중 일부는로드하는 데 오래 걸렸고, 외래 키 드롭 다운으로 인해 발생했음을 발견했을 때 솔루션을 찾기까지 어느 정도 시간이 걸렸습니다. 문제는이 행동이 웹 사이트의 내부 작동에 필수적이라는 것입니다. 이러한 외래 키 드롭 다운 목록은 실제로 DataGrid의 결과 집합을 구동합니다. ddlist가 채워지면 기본값이 설정되어 DataGrid를 필터링하는 이벤트가 발생합니다. 따라서이 비헤이비어를 사용하지 않도록 설정하는 것이 핵심입니다. 이 문제를 해결하는 첫 번째 단서는 내가 웹에서 찾은 훌륭한 일련의 블로그에서 나왔습니다. Kudos to Stephen Naughton 개념은 metacolumn 속성을 만들고 metatable 부분 클래스의 문제가있는 엔터티를 장식하는 것입니다.

[MetadataType(typeof(InvoiceMetadata))] 
public partial class Invoice { 

} 

public partial class InvoiceMetadata { 
    [ScaffoldColumn(false)] 
    public string InvoiceId { get; set; } 
    [ScaffoldColumn(false)] 
    public string LiquidatorInvoiceId { get; set; } 
    [ScaffoldColumn(false)] 
    public string CreatedBy { get; set; } 
    [ScaffoldColumn(false)] 
    public System.Nullable<System.DateTime> LastModifiedDate { get; set; } 
    [ScaffoldColumn(false)] 
    public string LastModifiedBy { get; set; } 
    [DisableFilter] 
    public LeadAccount LeadAccount { get; set; } 
} 

내 새로 생성 된 속성 DisableFilter에서, LeadAccount (우리의 연락 테이블) 장식 :

그래서, 당신은 테이블과 메타 테이블 부분 클래스 정의 유사한을하게 될 겁니다 (I 내 DisableFilter 이름) 수집.

일단 열이 장식되면 새로운 특성에 대한 검사를 추가하여 ForeignKey.ascx 컨트롤의 기본 동작을 변경했습니다. 필터가 비활성화되어 있으면 ddlist에 기본 항목 만 채 웁니다.

if (!Page.IsPostBack) { 
      if (!Column.IsRequired) { 
       DropDownList1.Items.Add(new ListItem("[Not Set]", NullValueString)); 
      } 
      if (Column.IsFilterDisabled()) { 

       DropDownList1.Items.Add(new ListItem(DefaultValue, DefaultValue)); 
      } 
      else { 
       PopulateListControl(DropDownList1); 
      } 
      // Set the initial value if there is one 
      string initialValue = DefaultValue; 
      if (!String.IsNullOrEmpty(initialValue)) { 
       DropDownList1.SelectedValue = initialValue; 
      } 
     } 
    } 

내가 전체 솔루션이라고 부르는 그 필터는 주로 사용자 친화적 인 이름을 포함하지 않습니다. 아직이 문제를 해결하지는 않았지만 문제 해결에 한 걸음 더 다가 가야합니다.

관련 문제