在Webforms MVP(ASP.NET)中,谁应该设置动态创建的usercontrol、view或presenter的数据?
我正在尝试使用WebformsMVP框架将Webforms应用程序重构为模型视图演示器(MVP)。在创建演示者和调整视图代码时,我遇到了一个视图,它动态地填充了它的一些子角色的数据。下面是我正在处理的视图的非重构版本的代码:在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
[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);
}
}