c# - 带有 ListView 和 Repeater 的 ASP.NET 中的模型 View 展示器

标签 c# asp.net mvp

我一直在探索 ASP.NET 的 MVP 模式,但在页面上使用数据绑定(bind)控件时,我无法将所有表示逻辑保留在演示器中。

以下场景和类只是示例,我正在处理的真实案例更为复杂。任何想法或方向将不胜感激。

假设我有一个页面显示有关客户的信息,包括姓名和地址。它还使用 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; }
}

起初我让演示者在 View 上设置名称、地址和订单列表。此时,根据订单上 IsRush 的值,Repeater 的 ItemDataBound 事件中仍然存在一些表示逻辑。在我看来,此逻辑不属于代码隐藏,而属于可测试的演示者类。

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,但我没有在任何地方找到任何类似的示例。我想出了几种方法来将所有演示逻辑保留在演示器中,但它们都感觉像是黑客,我想知道希望人们普遍处理这种情况。

谢谢!

最佳答案

答案肯定在模糊的边界上。更改紧急订单标签的颜色绝对在 View 的范围内,但确定紧急订单与正常订单的逻辑不是 IMO。

在您的情况下,我想象的是访客之类的东西。对于转发器中的每个订单,您将该订单传递给呈现器或 Controller ,并根据 View 不需要的领域知识调用 View 中的适当方法。

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

//在你的 Controller /presenter 中的某个地方

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

然后可以按照您已经详述的方式呈现 View 。 IMO 它很好地分离了职责和我在非 MVC ASP.Net 中经常使用的东西

希望这对您有所帮助。

关于c# - 带有 ListView 和 Repeater 的 ASP.NET 中的模型 View 展示器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1692022/

相关文章:

java - 使用 JSP 和 POJO 的被动 View 设计模式示例

mvp - 模型/ View /演示者 : presenter-to-presenter communication

c# - 为什么我的 CurrentCulture en-GB 而我的 CurrentUICulture en-US

c# - 对象未序列化

c# - 即使 DataGridView 绑定(bind)到列表,也不会显示任何记录

c# - 字符串在特定位置替换在 c# 中

c# - ASP.Net Web Api - ApiExplorer 不包含任何 ApiDescriptions

c# - C# 中的读取共享权限

c# - 使用 Xamarin.Mac 禁用耦合到 socket 的 NSMenuItem

c# - 带有可选参数的 MVC 操作——哪个更好?