在一个相当典型的 MVP 实现中,我希望 IView 接口将指定事件。演示者在获得对 IView 的引用(在您的情况下,这将在演示者的构造函数中)时,应该为它想要处理的任何事件附加事件处理程序。很多时候,其中一个事件是向演示者发出信号,表明数据应该放入视图中,或者放入视图模型中以供视图绑定。有时,该事件会表明演示者应该采取某种行动,例如更新模型或启动流程。
在 WebFormsMvp 中,在演示者将数据加载到视图的视图模型(通过设置 View.Model 属性)后,视图可以使用绑定语法绑定到视图模型。例如,您的文本框控件可能如下所示:
<asp:textbox runat="server" DataSource="<%# Model.Data %>" />
如果您没有使用 WebFormsMvp,那么您只想确保 Presenter 有办法将数据传递到视图中。您可以通过向用户控件实现的 IView 添加一个属性来执行此操作。当调用属性的设置器时,它需要将值传递给适当的控件。同样,当调用该属性的 getter 时,它应该返回该控件的值。
例如,您的用户控件可以包括这样的属性实现:
string IMyView.ViewData
{
get { return TextBox1.Text; }
set { TextBox1.Text = value; }
}
但是,如果您想变得花哨,您也可以使用 DataSource 控件。要记住的主要事情是,如果您采用 MVP,则希望 View 部分尽可能简单,因为 View 比 Presenter 更难测试。所以视图应该尽可能少地做——设置值、获取值和触发事件,以及其他很少的事情。动态视图行为,如隐藏或显示元素、突出显示或不突出显示等,应由 Presenter 使用 IView 接口的属性或通过 Presenter 和 View 共享的 ViewModel 控制。
就个人而言,我更喜欢并推荐使用 WebFormsMvp。