2009-11-07 1 views
3

Я изучал шаблон MVP с помощью ASP.NET, но у меня были проблемы с сохранением всей логики представления в презентаторе при использовании элемента управления данными на странице ,Model-View-Presenter в ASP.NET с ListView и репитером

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

Скажите, что у меня есть страница с информацией о клиенте, включая имя и адрес. Он также отображает список ордеров, использующих элемент управления ретранслятора.

public class CustomerDto { 
    public string Name { get; set; } 
    public string Address { get; set; } 
    public List<OrderDto> OrderList { get; set; } 
} 

public class OrderDto { 
    public int Id { get; set; } 
    public decimal Amount { get; set; } 
    public bool IsRush { get; set; } 
} 

Сначала я представил презентатору имя, адрес и адрес ордера на вид. В этот момент была еще какая-то логика представления, которая происходила в событии ItemDataBound ретранслятора в зависимости от значения IsRush в заказе. По-моему, эта логика не принадлежит коду, а в тестируемом классе презентатора.

public interface IOrderView { 
    void SetName(string name); 
    void SetAddress(string address); 
    void SetOrderList(List<OrderDto> orderList); 
} 

public partial class OrderPage : Page, IOrderView 
{ 
    public void SetName(string name) { 
     labelName.Text = name; 
    } 

    public void SetAddress(string address) { 
     labelAddress.Text = address; 
    } 

    public void SetOrderList(List<OrderDto> orderList) { 
     repeaterOrders.DataSource = orderList; 
     repeaterOrders.DataBind(); 
    } 

    protected void repeaterOrders_ItemDataBound(object sender, RepeaterItemEventArgs e) 
    { 
     if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem) { 
      OrderDto orderDto = e.Item.DataItem as OrderDto; 
      if (orderDto.IsRush) { 
       Label labelOrderId = (Label)e.Item.FindControl("labelOrderId"); 
       labelOrderId.ForeColor = System.Drawing.Color.Red; 
      } 
     } 
    } 
} 

Это почти кажется, что каждый элемент в повторителе нужен свой Presenter и вид, но я не нашел подобный пример в любом месте. Я придумал пару способов сохранить всю презентационную логику в презентаторе, но все они чувствуют себя взломанными, и мне было интересно, как люди, как правило, справляются с этой ситуацией.

Спасибо!

+0

Почему вы выбрали этот подход по ASP.NET MVC? –

+0

Я бы предпочел работать с приложением Model 2/MVC, но я создаю новые страницы в существующем приложении. Благодарю. – celticpride

ответ

4

Ответ определенно на размытой границе. Изменение цвета ярлыка для заказов на спешки определенно находится в сфере взгляда, но логика определения срочных заказов по сравнению с обычными порядками не является ИМО.

В вашем случае я представляю что-то вроде посетителя. Предложенный порядок в повторителе вы передаете этот заказ на ведущий или контроллер и который вызывает соответствующий метод в представлении на основе знаний о том, что представление не нуждается.

 
OrderDto orderDto = e.Item.DataItem as OrderDto; 
controller.Visit(this, orderDto); 

// где-то в контроллер/ведущий у вас есть

 
void Visit(ISomeView view, OrderDto dto) { 
    if (dto.IsRush) { 
     view.RenderRushOrder(dto); 
    } else { 
     view.RenderNornamlOrder(dto); 
    } 
} 

мнение, то может сделать, как вы уже детализированы. ИМО это прекрасно разделяет обязанности и что-то, что я часто использую на практике в не MVC ASP.Net

Надеюсь, это поможет.

+0

Я не думаю, что посещение должно принять представление, поскольку ведущий в веб-формах обычно имеет ссылку на представление в любом случае. – epitka

1

Решение применить ForeColor или нет является логическим и должно быть в презентаторе для проверки.

Вы можете добавить атрибут CssClass или ForeColor в свой объект DTO. Вы определенно хотите проверить, был ли атрибут установлен или нет в соответствии с вашей логикой в ​​настоящее время в OnItemDataBound.