2010-03-30 3 views
2

현재 프로젝트 내의 여러 위치에서 사용할 수 있도록 일부 사용자 정의 컨트롤을 개발 중입니다. 하나의 컨트롤은 고객의 주소 목록을 편집하는 것입니다. 이 작업은 프로젝트 내의 여러 위치에서 수행되어야하므로 간단한 사용자 컨트롤로 만들고 싶습니다. 사용자 정의 컨트롤에는 리피터 컨트롤이 포함되어 있습니다. 기본적으로 중계기는 편집 할 주소 항목 하나를 표시합니다. 더 많은 주소를 추가해야하는 경우 사용자는 단추를 클릭하여 입력 할 추가 주소를 추가 할 수 있습니다. 사용자 정의 컨트롤은 새로운 주소를 생성하고 기존 주소를 편집하는 데 사용됩니다. 주소 사업체는 다음과 같이 보입니다 : 당신이 거리와 도시가있는 경우 주소는 인스턴스화 할 수 있습니다 볼 수 있듯이ASP.net 사용자 정의 컨트롤 및 비즈니스 엔터티

public class Address 
{ 
    public string Street { get; set; } 

    public City City { get; set; } 

    public Address(string street, City city) 
    { 
     Check.NotNullOrEmpty(street); 
     Check.NotNull(city); 

     Street = street; 
     City = city; 
    } 
} 

합니다.

이제 사용자 정의 컨트롤이 Addresses이라는 컬렉션 속성을 노출한다고 생각했습니다. 이 등록 정보의 getter는 repeater에서 주소를 수집하여 콜렉션으로 리턴합니다. 설정자는 repeater에 편집 할 주소를 데이터 바인딩합니다. 이처럼

는 : 객체 지향은 매우 쉽게 컨트롤을 재사용 할 수 있기 때문에

public partial class AddressEditControl : System.Web.UI.UserControl 
{ 

    public IEnumerable<Address> Addresses 
    { 
     get 
     { 
      IList<Address> addresses = new List<Address>(); 
      // collect items from repeater and create addresses 
      foreach (RepeaterItem item in addressRepeater.Items) 
      { 
       // collect values from repeater item 

       addresses.Add(new Address(street, city)); 
      } 

      return addresses; 
     } 
     set 
     { 
      addressRepeater.DataSource = value; 
      addressRepeater.DataBind(); 
     } 
    } 
} 

는 우선이 방법을 좋아했다. 하지만 내 프로젝트의 일부 장소에서 사용자가 일부 주소를 입력 할 수 있도록이 컨트롤을 사용하고 싶었습니다. 그리고 각 리피터 항목의 거리 입력 필드를 미리 채우고 싶었습니다. 사용자가 그 데이터를 입력해야하므로 입력하지 않아도됩니다.

이제이 사용자 정의 컨트롤은 유효한 상태의 주소 만 받아들입니다 (주소 개체에는 생성자가 하나만 있기 때문에). 그래서 난 할 수 없어 : 도시가 null이기 때문에이 주소에서 오류가 발생하는 것이기 때문에

IList<Addresses> addresses = new List<Address>(); 
addresses.Add(new Address("someStreet", null)); // i dont know the city yet (user has to find it out) 

addressControl.Addresses = addresses; 

따라서 위가 불가능합니다.

이제 내 질문 : 어떻게 그러한 컨트롤을 만들 수 있습니까? ;) 실제 주소 대신 주소 DTO를 사용하려고 생각 했으므로 나중에 주소에 매핑 할 수 있습니다. 그렇게하면 주소가 유효하지 않아도되는 주소 컬렉션을 전달할 수 있습니다. 또는 사용자 컨트롤이 작동하는 방식을 잘못 이해 했습니까? 모범 사례가 있습니까?

답변

3

BusinessControls (부분 및 잘못된 상태의 데이터를 허용해야 할 수도 있음)에 Business Objects (엄격한 규칙 및 제한된 생성자가 있음)를 직접 바인딩하면 위험 할 수 있습니다.

주소보기 모델 (보기 모델은 컨트롤러와 사용자 정의 컨트롤 사이에서 대화하는 데 사용되는 DTO)을 사용하는 경우보기 모델에서 오래된 쓰레기를 허용 할 수 있으며 유효성을 검사해야합니다 그것이 주소로 바뀌기 전에.

이렇게하면 다시보기/사용자 정의 컨트롤을 비즈니스 계층에서 분리 할 수 ​​있으므로 재사용이 쉬워집니다.

관련 문제