我一直在探索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;
}
}
}
}
這似乎像在中繼器的每個項目都需要自己的演示和看法,但我還沒有發現任何類似的例子在任何地方。我已經提出了幾種方法來保持主講者的所有表達邏輯,但他們都覺得自己像一個黑客,我想知道希望人們能夠普遍處理這種情況。
謝謝!
你爲什麼選擇ASP.NET MVC的這種方法? – 2009-11-07 06:51:39
我寧願使用Model 2/MVC應用程序,但我正在現有應用程序中創建新頁面。謝謝。 – celticpride 2009-11-09 00:42:54