我一直在研究ASP.NET中的MVP模式,但是当页面上使用数据绑定控件时,我很难将所有展示逻辑保留在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; }
}
一开始我让演示者在视图上设置名称、地址和订单列表。此时,在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;
}
}
}
}
每个重复器中的项目似乎都需要自己的Presenter和View,但我在任何地方都没有找到类似的例子。我想出了几种方法来将所有演示逻辑保留在Presenter中,但它们都感觉像是一个hack,我想知道人们通常如何处理这种情况。
谢谢!