2009-11-07 39 views
3

我一直在探索ASP.NET的MVP模式,但在頁面上使用數據綁定控件時,我無法保持演示者中的所有表示邏輯。使用ListView和Repeater的ASP.NET中的Model-View-Presenter

下面的場景和類只是舉例,我正在處理的真實案例更復雜。任何想法或方向將不勝感激。

假設我有一個頁面顯示有關客戶的信息,包括姓名和地址。它還使用Repeater控件呈現訂單列表。

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

起初,我讓演示者在視圖上設置了Name,Address和OrdrerList。此時,Repeater的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; 
      } 
     } 
    } 
} 

這似乎像在中繼器的每個項目都需要自己的演示和看法,但我還沒有發現任何類似的例子在任何地方。我已經提出了幾種方法來保持主講者的所有表達邏輯,但他們都覺得自己像一個黑客,我想知道希望人們能夠普遍處理這種情況。

謝謝!

+0

你爲什麼選擇ASP.NET MVC的這種方法? – 2009-11-07 06:51:39

+0

我寧願使用Model 2/MVC應用程序,但我正在現有應用程序中創建新頁面。謝謝。 – celticpride 2009-11-09 00:42:54

回答

4

答案肯定是在模糊的邊界上。改變緊急訂單標籤的顏色絕對是在視圖領域,但確定緊急訂單與正常訂單的邏輯不是IMO。

在你的情況下,我想像一個訪客。在中繼器中的Foreach命令將該命令傳遞給演示者或控制器,並根據視圖不需要的領域知識在視圖中調用適當的方法。

 
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

我不認爲訪問需要接受視圖,因爲webforms中的主持人通常都有對視圖的引用。 – epitka 2009-12-01 19:51:53

1

應用ForeColor與否的決定是邏輯,必須在演示者是可測試的。

您可以將CssClass或ForeColor屬性添加到對象DTO。您一定希望能夠根據您當前在OnItemDataBound中的邏輯來測試屬性是否已設置。