事件冒泡和 MVP:ASP.NET [英] Event Bubbling and MVP: ASP.NET
本文介绍了事件冒泡和 MVP:ASP.NET的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我正在努力学习MVP
它在 ASP.NET 中使用 Web 表单.我有两个用户控件 CurrentTimeView.ascx 和 MonthViewControl.ascx.CurrentTimeView 显示时间.有一个文本框可以在同一控件中添加天数.新得到的日期称为结果日期".当点击按钮添加天数时,会引发一个事件myBtnAddDaysClickedEvent".
在 MonthViewControl 上,有一个标签显示结果日期"的月份.目前我正在为变量monthValueToPass"设置一个样本值(因为我不知道如何正确地做).如何设置monthValueToPass 变量的值以使其符合MVP 模型?
string monthValueToPass = "TEST";monthPresenter.SetMonth(monthValueToPass);
期望创建易于进行单元测试且不违反 MVP 架构的 MVP.
注意:虽然这是一个简单的示例,但我期待使用 MVP 和验证机制对 GridView 控件中的数据绑定进行可扩展的答案.
注意:视图可以完全独立于演示者吗?
注意:这里的每个用户控件都是单独的视图
注意:同一个演示者是否可以有多个视图(比如根据他们的权限为不同用户提供不同的控件?)
指南
--完整代码--
使用系统;公共接口 ICurrentTimeView{//属性视图日期时间 当前时间{放;}//查看方法无效AttachPresenter(CurrentTimePresenter演示者);}使用系统;公共接口 IMonthView{//属性视图字符串月份名称{放;}//查看方法//查看界面知道presenter无效AttachPresenter(MonthPresenter演示者);}使用系统;公共类 CurrentTimePresenter{私有 ICurrentTimeView 视图;//prsenter 的构造函数公共 CurrentTimePresenter(ICurrentTimeView inputView){如果(输入视图 == 空){throw new ArgumentNullException("视图不能为空");}}this.view = inputView;}//Presenter中定义的方法public void SetCurrentTime(bool isPostBack){如果 (!isPostBack){view.CurrentTime = DateTime.Now;}}//Presenter中定义的方法public void AddDays(string daysUnparsed, bool isPageValid){如果(isPageValid){view.CurrentTime = DateTime.Now.AddDays(double.Parse(daysUnparsed));}}使用系统;公开课 MonthPresenter{私人 IMonthView 月视图;//prsenter 的构造函数公共 MonthPresenter(IMonthView inputView){如果(输入视图 == 空){throw new ArgumentNullException("视图不能为空");}this.monthView = inputView;}//Presenter中定义的方法//presenter 如何决定需要的值.公共无效SetMonth(字符串monthValueInput){如果 (!String.IsNullOrEmpty(monthValueInput)){月视图.月名 = 月值输入;}别的{}}}
用户控制 1
<%@ Control Language="C#" AutoEventWireup="true" CodeFile="CurrentTimeView.ascx.cs" Inherits="Views_CurrentTimeView" %><asp:Label id="lblMessage" runat="server"/><br/><asp:Label id="lblCurrentTime" runat="server"/><br/><br/><asp:TextBox id="txtNumberOfDays" runat="server"/><asp:Button id="btnAddDays" Text="Add Days" runat="server" OnClick="btnAddDays_OnClick" ValidationGroup="AddDays"/>使用系统;使用 System.Web.UI;公共部分类 Views_CurrentTimeView : UserControl, ICurrentTimeView{//1.除了用于附加演示者的视图定义方法外,用户控件没有其他方法//2.属性只有设置方法私人 CurrentTimePresenter 演示者;//代表公共委托无效 OnAddDaysClickedDelegate(string strValue);//事件公共事件 OnAddDaysClickedDelegate myBtnAddDaysClickedEvent;//用于从aspx页面获取用户控件中的演示者.public void AttachPresenter(CurrentTimePresenter 演示者){如果(演示者 == 空){throw new ArgumentNullException("presenter 不能为空");}this.presenter = 主持人;}//实现视图的属性公共日期时间当前时间{放{//在设置属性时,设置控件的值lblCurrentTime.Text = value.ToString();}}//用户控件中的事件处理程序protected void btnAddDays_OnClick(object sender, EventArgs e){如果(演示者 == 空){throw new FieldAccessException("presenter null");}//要求presenter做它的功能Presenter.AddDays(txtNumberOfDays.Text, Page.IsValid);//引发事件if (myBtnAddDaysClickedEvent != null){myBtnAddDaysClickedEvent(string.Empty);}}}
用户控制 2
<%@ Control Language="C#" AutoEventWireup="true" CodeFile="MonthViewControl.ascx.cs" Inherits="Views_MonthViewControl" %>
使用系统;使用 System.Web;使用 System.Web.UI;使用 System.Web.UI.WebControls;公共部分类 Views_MonthViewControl : System.Web.UI.UserControl, IMonthView{//1.除了用于附加演示者的视图定义方法外,用户控件没有其他方法//2.属性只有设置方法私人 MonthPresenter 主持人;//从aspx页面设置用户控件中的演示者.public void AttachPresenter(MonthPresenter 演示者){如果(演示者 == 空){throw new ArgumentNullException("presenter 不能为空");}this.presenter = 主持人;}//实现视图的属性公共字符串 MonthName{放{//在设置popert期间,设置控件的值lblMonth.Text = value.ToString();}}protected void Page_Load(object sender, EventArgs e){}}
ASPX 页面
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="ShowMeTheTime.aspx.cs" Inherits="ShowTime" %><%@ Register TagPrefix="mvpProject" TagName="CurrentTimeView" Src="Views/CurrentTimeView.ascx" %><%@ Register TagPrefix="month" TagName="MonthView" Src="Views/MonthViewControl.ascx" %><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml" ><head runat="服务器"><title>页面标题</title>头部><身体><form id="form1" runat="server"><mvpProject:CurrentTimeView id="ucCtrlcurrentTimeView" runat="server"/><br/><br/><month:MonthView id="ucCtrlMonthView" runat="server"/></表单>