2010-03-30 2 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. Получатель этого свойства собирает адреса из репитера и возвращает его в коллекцию. Установщик будет привязывать данные к адресам, которые будут редактироваться в ретрансляторе.

Как это:

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(); 
     } 
    } 
} 

Сначала мне понравился этот подход, поскольку он объектно-ориентированный делает его очень легким для повторного использования элемента управления. Но в каком-то месте в моем проекте я хотел использовать этот элемент управления, чтобы пользователь мог ввести некоторые адреса. И я хотел предварительно заполнить поле ввода улицы каждого элемента ретранслятора, так как у меня были эти данные, поэтому пользователю не нужно вводить его сам.

Теперь проблема в том, что этот пользовательский элемент управления принимает адреса только в допустимом состоянии (поскольку адресный объект имеет только один конструктор). Так что я не могу сделать:

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

Непосредственно привязанные к объектам Business Objects (которые имеют строгие правила и возвращаемые конструкторы) в UserControls (которые, возможно, должны разрешать данные в частичных и недействительных состояниях) чреваты опасностью.

Если вы хотите использовать модель просмотра адресов (модель просмотра - это DTO, используемый для разговора между контроллером и User Control), тогда вы можете разрешить любой старый мусор в модели представления, который должен быть проверен прежде чем он превратился в адрес.

Это также позволяет разделять View/UserControl с бизнес-слоем, поэтому повторное использование становится проще.

Смежные вопросы