在Webforms MVP(ASP.NET)中,谁应该设置动态创建的usercontrol、view或presenter的数据?

在Webforms MVP(ASP.NET)中,谁应该设置动态创建的usercontrol、view或presenter的数据?,asp.net,webforms,webformsmvp,Asp.net,Webforms,Webformsmvp,我正在尝试使用WebformsMVP框架将Webforms应用程序重构为模型视图演示器(MVP)。在创建演示者和调整视图代码时,我遇到了一个视图,它动态地填充了它的一些子角色的数据。下面是我正在处理的视图的非重构版本的代码: [PresenterBinding(typeof(OrderDetailsPresenter))] public partial class OrderDetails : AuthorizedPageBase<OrderDetailsPage>, IOrderD

我正在尝试使用WebformsMVP框架将Webforms应用程序重构为模型视图演示器(MVP)。在创建演示者和调整视图代码时,我遇到了一个视图,它动态地填充了它的一些子角色的数据。下面是我正在处理的视图的非重构版本的代码:

[PresenterBinding(typeof(OrderDetailsPresenter))]
public partial class OrderDetails : AuthorizedPageBase<OrderDetailsPage>, IOrderDetails
{
    private PurchaseOrder _orderDetail;

    private int _orderGroupId;

    protected new void Page_Load(object sender, EventArgs e)
    {
        base.Page_Load(sender, e);

        _orderGroupId = string.IsNullOrEmpty(Request.QueryString["po"])
            ? _orderGroupId = 0
            : _orderGroupId = Int32.Parse(Request.QueryString["po"].ToString(CultureInfo.InvariantCulture));

        _orderDetail = OrderContext.Current.GetPurchaseOrder(SecurityContext.Current.CurrentContactId, _orderGroupId);

        if (_orderDetail == null)
            return;

        if (_orderDetail.OrderForms[0].Shipments.Count > 1)
        {
            var control = (OrderDetailsMultiShipment)LoadControl("~/Templates/Sample/Units/AccountManagement/OrderDetailsMultiShipment.ascx");
            control.OrderDetail = _orderDetail;
            modulePlaceHolder.Controls.Add(control);
        }
        else
        {
            var control = (OrderDetailsSingleShipment)LoadControl("~/Templates/Sample/Units/AccountManagement/OrderDetailsSingleShipment.ascx");
            control.OrderDetail = _orderDetail;
            modulePlaceHolder.Controls.Add(control);
        }

    }
}
[PresenterBinding(typeof(OrderDetailsPresenter))]
公共部分类OrderDetails:AuthorizedPageBase、IOrderDetails
{
私人采购订单_orderDetail;
私有int_orderGroupId;
受保护的新无效页面加载(对象发送方,事件参数e)
{
基本页面加载(发送方,e);
_orderGroupId=string.IsNullOrEmpty(Request.QueryString[“po”])
?_orderGroupId=0
:_orderGroupId=Int32.Parse(Request.QueryString[“po”].ToString(CultureInfo.InvariantCulture));
_orderDetail=OrderContext.Current.GetPurchaseOrder(SecurityContext.Current.CurrentContactId,_orderGroupId);
如果(_orderDetail==null)
返回;
如果(_orderDetail.OrderForms[0].Shippings.Count>1)
{
var control=(orderDetailsMultiShipping)LoadControl(“~/Templates/Sample/Units/AccountManagement/orderDetailsMultiShipping.ascx”);
control.OrderDetail=\u OrderDetail;
modulePlaceHolder.Controls.Add(控件);
}
其他的
{
var control=(orderDetailsSingleShipping)LoadControl(“~/Templates/Sample/Units/AccountManagement/orderDetailsSingleShipping.ascx”);
control.OrderDetail=\u OrderDetail;
modulePlaceHolder.Controls.Add(控件);
}
}
}
如您所见,根据值的不同,一个控件或另一个控件加载了多个信息。我的想法是:

  • 将PurchaseOrder属性移动到演示者
  • 尝试从页面加载中移动尽可能多的逻辑
  • 将控件重构为简单的,不填充任何OrderDetail属性(这是我最困惑的问题)
我尝试了以下方法来解决这些问题(创建一个演示者用数据填充的事件,然后由视图检查):

[PresenterBinding(typeof(OrderDetailsPresenter))]
公共部分类OrderDetails:AuthorizedPageBase、IOrderDetails
{
公共事件事件处理程序;
受保护的新无效页面加载(对象发送方,事件参数e)
{
基本页面加载(发送方,e);
var args=new GetShipmentsArgs();
获取装运(此,args);
如果(args.shippings.Count>1)
{
var control=(orderDetailsMultiShipping)LoadControl(“~/Templates/Sample/Units/AccountManagement/orderDetailsMultiShipping.ascx”);
control.OrderDetail=\u OrderDetail;//这里我复制了我试图解决的问题。。。
modulePlaceHolder.Controls.Add(控件);
}
其他的
{
var control=(orderDetailsSingleShipping)LoadControl(“~/Templates/Sample/Units/AccountManagement/orderDetailsSingleShipping.ascx”);
control.OrderDetail=\u OrderDetail;//这里我复制了我试图解决的问题。。。
modulePlaceHolder.Controls.Add(控件);
}
}
是的,我知道我的代码无法编译,但我希望它能澄清我的想法。我的方法仍然有几个问题: -视图仍然具有决定加载哪个控件的逻辑,并且必须为要加载的控件加载信息

我曾考虑过一个演示者间交流的系统,但我不确定这是否是最好的解决方案。在MVP范式下重构我的初始代码的最佳方法是什么


谢谢你

我尊重WebformsMVP,但是如果你必须更新那么多的更改,为什么不更新ASP.Net MVC?@Win我正在进行的项目,由于时间限制,这不是一个真正的选项。。。
[PresenterBinding(typeof(OrderDetailsPresenter))]
public partial class OrderDetails : AuthorizedPageBase<OrderDetailsPage>, IOrderDetails
{
    public event EventHandler<GetShipmentsArgs> GetShipments;

    protected new void Page_Load(object sender, EventArgs e)
    {
        base.Page_Load(sender, e);

        var args = new GetShipmentsArgs();
        GetShipments(this, args);

        if (args.Shipments.Count > 1)
        {
            var control = (OrderDetailsMultiShipment)LoadControl("~/Templates/Sample/Units/AccountManagement/OrderDetailsMultiShipment.ascx");
            control.OrderDetail = _orderDetail; //Here I duplicate the problem I tried to solve...
            modulePlaceHolder.Controls.Add(control);
        }
        else
        {
            var control = (OrderDetailsSingleShipment)LoadControl("~/Templates/Sample/Units/AccountManagement/OrderDetailsSingleShipment.ascx");
            control.OrderDetail = _orderDetail; //Here I duplicate the problem I tried to solve...
            modulePlaceHolder.Controls.Add(control);
        }
    }