事件冒泡和MVP:ASP.NET我正在尝试学习在ASP.NET中使用WebForms的MVP。我有两个用户控件CurrentTimeView.ascx和MonthViewControl.ascx。CurrentTimeView显示时间。有一个文本框可以在同一个控件中添加天数。新获得的日期称为“结果日期”。单击按钮添加天数时,将引发事件“myBtnAddDaysClickedEvent”。在MonthViewControl上,有一个标签显示“结果日期”的月份。目前我正在为变量“monthValueToPass”设置一个样本值(因为我不知道如何正确地做)。如何设置monthValueToPass变量的值以使其符合MVP模型?stringmonthValueToPass="TEST";monthPresenter.SetMonth(monthValueToPass);期望是创建一个易于单元测试且不违反MVP架构的MVP。注意:虽然这是一个简单的示例,但我期待着scalablt对使用MVP和验证机制在GridView控件中进行数据绑定的回答。注意:是否可以查看完全独立的演示者?注意:每个用户控件是一个单独的视图注意:同一个演示者可以有多个视图(不同用户的不同控件,基于他们的批准?)指南模型视图演示者-指南-完整代码-使用系统;publicinterfaceICurrentTimeView{//视图的属性DateTimeCurrentTime{set;}//View的方法voidAttachPresenter(CurrentTimePresenterpresenter);}使用系统;publicinterfaceIMonthView{//View的属性stringMonthName{set;}//View的方法//View界面知道presentervoidAttachPresenter(MonthPresenterpresenter);}使用系统;公共类CurrentTimePresenter{私有ICurrentTimeView视图;//Presenter的构造函数}this.view=inputView;}//Presenter中定义的方法publicvoidSetCurrentTime(boolisPostBack){if(!isPostBack){view.CurrentTime=DateTime.Now;}}//Presenter中定义的方法publicvoidAddDays(stringdaysUnparsed,boolisPageValid){if(isPageValid){view.CurrentTime=DateTime.Now.AddDays(double.Parse(daysUnparsed));}}}使用系统;公共类MonthPresenter{私人IMonthViewmonthView;//presenter的构造函数publicMonthPresenter(IMonthViewinputView){if(inputView==null){thrownewArgumentNullException("viewmaynotbenull");}this.monthView=inputView;}//Presenter中定义的方法//presenter如何决定需要的值。publicvoidSetMonth(stringmonthValueInput){if(!String.IsNullOrEmpty(monthValueInput)){monthView.MonthName=monthValueInput;}else{}}}用户控制1usingSystem;使用System.Web.UI;publicpartialclassViews_CurrentTimeView:UserControl,ICurrentTimeView{//1.除了用于附加演示者的视图定义方法之外,用户控件没有其他方法//2。属性只有设置方法privateCurrentTimePresenterpresenter;//委托publicdelegatevoidOnAddDaysClicked委托(字符串strValue);//事件publiceventOnAddDaysClickedDelegatemyBtnAddDaysClickedEvent;//提供从aspx页面获取用户控件中的演示者。publicvoidAttachPresenter(CurrentTimePresenterpresenter){if(presenter==null){thrownewArgumentNullException("presentermaynotbenull");}this.presenter=演示者;}//实现View的PropertypublicDateTimeCurrentTime{set{//在设置属性时,设置控件的值lblCurrentTime.Text=value.ToString();}}//用户控件中的事件处理程序protectedvoidbtnAddDays_OnClick(objectsender,EventArgse){if(presenter==null){thrownewFieldAccessException("presenternull");}//要求演示者执行其功能presenter.AddDays(txtNumberOfDays.Text,Page.IsValid);//引发事件if(myBtnAddDaysClickedEvent!=null){myBtnAddDaysClickedEvent(string.Empty);}}}用户控制2usingSystem;使用System.Web;使用System.Web.UI;使用System.Web.UI.WebControls;publicpartialclassViews_MonthViewControl:System.Web.UI.UserControl,IMonthView{//1.除了用于附加演示者的视图定义方法之外,用户控件没有其他方法//2。属性只有set方法privateMonthPresenterpresenter;//提供从aspx页面获取用户控件中的演示者。publicvoidAttachPresenter(MonthPresenterpresenter){if(presenter==null){thrownewArgumentNullException("presentermaynotbenull");}this.presenter=演示者;}//实现View的PropertypublicstringMonthName{set{//在设置popert时,设置控件的值lblMonth.Text=value.ToString();}}protectedvoidPage_Load(objectsender,EventArgse){}}ASPX页面标题usingSystem;使用System.Web.UI;publicpartialclassShowTime:Page{CurrentTimePresentercurrentTimePresenter;MonthPresentermonthPresenter;protectedvoidPage_Load(objectsender,EventArgse){HelperInitCurrentTimeView();HelperInitMonth();}privatevoidHelperInitMonth(){//创建演示者monthPresenter=newMonthPresenter(ucCtrlMonthView);//将presenter对象传递给用户控件ucCtrlMonthView.AttachPresenter(monthPresenter);}privatevoidHelperInitCurrentTimeView(){//通过将视图(用户控件)传递给演示者来创建演示者。//用户控件已经实现IViewcurrentTimePresenter=newCurrentTimePresenter(ucCtrlcurrentTimeView);//将presenter对象传递给用户控件ucCtrlcurrentTimeView.AttachPresenter(currentTimePresenter);//调用presenteraction来加载用户控件中的时间。currentTimePresenter.SetCurrentTime(Page.IsPostBack);//用户控件中描述的事件????订阅它。ucCtrlcurrentTimeView.myBtnAddDaysClickedEvent+=newViews_CurrentTimeView.OnAddDaysClickedDelegate(CurrentTimeViewControl_AddButtonClicked_MainPageHandler);}voidCurrentTimeViewControl_AddButtonClicked_MainPageHandler(stringstrValue){stringmonthValue="l";monthPresenter.SetMonth("样本值");//myGridCtrl.CurentCharacter=theLetterCtrl.SelectedLetter;//myGridCntrl.LoadGridValues();一些MVP讨论:ModelViewPresenter–Guide验证是在MVP中编写的MVP中的MVP活动或属性模型-事件MVP-演示者我应该使用会话吗?为什么在大多数ASP.NETMVP实现中Presenter附加到View事件而不是View调用Presenter方法?公共方法或订阅视图事件MVP模式,宿主有多少视图?MVP和UserControls以及调用ASP.NETWeb窗体-模型视图演示者和用户控件控制限制违规体系结构-asp.netMVP控件在表示层中的修改解耦视图、演示文稿和ASP.NETWeb窗体Web窗体TLDR代码这就是我的方式做吧。你说你在同一页上有2个控件。这可以由ContainerVM提供,其中包含TimeVM和MonthVM的引用(成员)。每当您执行操作时,TimeVM都会更新支持属性ResultantDate。ContainerVM已订阅TimeVM.ResultantDate的属性更改通知。每当它收到更改通知时,它都会调用MonthVM.SetMonth()现在可以在不使用任何视图的情况下进行测试-纯粹在演示者级别。感谢您的输入。我参考了MVP快速入门http://msdn.microsoft.com/en-us/library/ff650240.aspx。模型可以引发事件。我想,我应该采用这种方法。欢迎任何想法。此外,我还发布了http://forums.asp.net/t/1760921.aspx/1?Model+View+Presenter+Guidelines以收集有关MVP的一般规则。参考开发可以与View和Model通信的Presenter。演示者可能只知道视图的界面。即使具体视图发生变化,也不会影响演示者。在具体视图中,控件的事件处理程序将简单地调用演示者方法或引发演示者将订阅的事件。不应该在具体视图中编写表示规则/逻辑。Presenter应该只有模型的接口对象;不是具体模型。这是为了方便单元测试View可以引用业务实体。但是,不应编写与实体对象关联的逻辑。它可能只是将实体对象传递给演示者。View接口应该是一个抽象。它不应包含任何控件或System.Web引用。具体来看,除了接口定义的方法外,不应该有其他方法。“模型”永远不知道具体视图和界面视图“模型”可以定义和引发事件。演示者可以订阅模型引发的这些事件。演示者中的公共方法应该是无参数的。视图对象应该只访问演示者的无参数方法。另一种选择是视图可以定义演示者可以订阅的事件。无论哪种方式,都不应传递任何参数。由于模型具有所有需要的值(要存储在数据库中),因此不需要从视图向模型传递任何值(在大多数情况下)。例如,当在下拉列表中选择一个项目时,只需要将控件的当前索引传递给模型。然后模型知道如何获取相应的字段值。在这种情况下,视图不需要向演示者传递任何内容。Presenter知道如何从视图中获取价值。视图可以直接使用模型(无需使用演示者)。例如ObjectDataSource的SelectMethod。但是控制器永远不知道具体视图和界面视图。演示者指的是视图界面而不是视图的具体实现。这允许您在运行单元测试时用模拟视图替换真实视图。我没有使用ASP.net的经验,但我想我遵循了你想要做的事情的要点。通过为单个UI元素制作演示者,您似乎可以与演示者达到一定的水平。在这种情况下,月份和时间。我会把它想象成ShowTime时期。ShowTime具有显示月份和时间的功能。将其与MVP一起使用。然后您将需要您的页面将实现的IShowTimeView。(不是控件)。然后编写一个使用IShowTimeView发送和检索值的ShowTimePresenter。您将使ShowTime实现IShowTimeView接口。它将时间、AddDay事件和月份等项目与页面上的实际控件相关联。所以如果我理解你的写作。事件的顺序是这样的。用户键入要添加的日期。用户点击添加天数添加天数,这会触发调用当前方法添加天数的事件。在演示者中添加天数的方法将执行计算和其他所需的步骤。然后,adddays方法将使用Presenter中的View指针来指示View使用计算值更新Month。视图然后将计算值设置为控件上的正确属性。对于单元测试,您需要创建一个实现IShowTimeView的模拟对象,并用它代替实际的页面对象。以上就是C#学习教程:事件冒泡与MVP:ASP.NET分享的全部内容。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
