2009-11-07 45 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中的逻辑来测试属性是否已设置。

相关问题