[英]ASP.NET MVP Pattern
我正在尝试在我的应用程序中实现Model-View-Presenter设计模式。 MVP模式的一般概念对我来说是已知的,但我更难以使用嵌套的用户控件来完成它。
我有一些可能的方案我可以实现,但在此之前,我想听听你的意见。
我认为发布我的任何代码并不重要,因为它更像是一个我试图理解的“概念”。
所以场景是:
1页用于连接2个用户控件。 其中一个用户控件包含一个子用户控件。 在这种情况下,我如何解决MVP模式?
1 Page
1 UC
1 UC
1 SubUC
编辑:
基本上我想知道的是我们如何在两个用户控件中使用MVP在两个视图(父级和子级)之间进行交互。
我将在没有MVP的ASP.net中向您展示一个示例: http : //pastie.org/5452134
现在使用MVP,我们是否仍然使用CodeBehind注册此类事件? 知道这个父和子用户控件都将使用MVP模式。 或者演示者是否包含在此互动中?
最终我可以将代码更改为: http : //pastie.org/5452180
但考虑到MVP模式,我想知道这是否合适......
或者我们更需要这样的方法: http : //pastie.org/5452174
以上所有示例都是在父视图的CodeBehind中编写的。 这是正确的吗? 如果没有,我们如何使用更好的方法实现这一目标
编辑2:我已经在我的示例方法中添加了一个解决方案: https : //github.com/frederikprijck/ASP.NET-MVP我认为这应该是我想要的...
我没有看到问题 - 用户控制只是一个视图。 演示者可以一次与多个视图进行交互。 因此,在这种情况下,您的演示者可以引用4个视图(一个用于页面,两个用于用户控件,最后一个用于子用户控件)。
或者,您希望每个演示者具有单个视图,在这种情况下,您可以将用户控件视为父视图(页面)的子视图,因此父视图需要为演示者提供向上和向下视图交互。 但是,我更喜欢早期的方法,其中演示者处理交互多个视图。
请参阅有关如何完成接线的相关问题: https : //softwareengineering.stackexchange.com/questions/60774/model-view-presenter-implementation-thoughts
最后,你可能想看看MVVM模式,我相信它对于组合UI很有用。 您将拥有控制视图和模型之间交互的视图模型,而不是演示者 - 但是,与演示者不同,视图模型不了解视图 - 而是视图观察(和更新)视图模型以呈现自身。 在这里查看这篇文章(View Model被称为Presentation Model): http : //www.codeproject.com/Articles/23340/Presentation-Model-in-Action
编辑 :
说实话,我不喜欢你的任何方法。 我喜欢MVP实现,其中presenter通过接口保持对视图的引用(没有紧耦合),并且视图执行连接,即创建presenter实例并注入视图引用。 演示者侦听视图中的事件和调用方法。 View永远不会直接调用presenter的方法。 (MVP的其他变体是可能的 - 参见我所寻求的SO答案)。 有了这个,我将解释我之前解释过的两种方法。
方法1 :
每个用户控件都是一个独立的视图。 会有一个共同的演示者来处理多个视图。 例如,
public class Presenter1
{
IView1 _view1;
IView2 _view2;
public Presenter1(IView1 view1, IView2 view2)
{
_view1 = view1;
_view2 = view2;
_view1.OnSave += OnSave;
_view1.OnSomeEvent += OnSomeEvent;
_view2.OnFoo += OnFoo;
}
public void OnSave()
{
var data1 = _view1.GetData();
var data2 = _view2.GetData();
// update model
...
}
public void OnSomeEvent()
{
// inform view2 about it
_view2.DoOnSomeEvent();
}
...
}
public partial class MyPage : Page, IView1
{
public void Page_Load(...)
{
//do wire up
_presenter = new Presenter(this, usercontrol1);
}
...
}
基本的想法是视图不做交叉谈话。 如果用户控件需要通知页面某些内容,则会引发由演示者捕获的事件,并将其通知页面。 视图是被动的并处理UI。
方法2:
Usercontrol和Page交互。 在这种情况下,Page将作为终极视图,Presenter将参考它。 控件的事件将由页面处理,页面将在必要时冒泡事件。 例如,
IView1 : IView2 { }
public class Presenter1
{
IView1 _view1;
public Presenter1(IView1 view1)
{
_view1 = view1;
_view1.OnSave += OnSave;
_view1.OnSomeEvent += OnSomeEvent;
_view1.OnFoo += OnFoo;
}
...
}
public partial class MyPage : Page, IView1
{
public void Page_Load(...)
{
//do wire up
_presenter = new Presenter(this);
// handle user control events
UserControl1.Foo += UserControl1_OnFoo();
UserControl1.XyzEvent += UserControl1_XyzEvent();
}
...
private void UserControl1_OnFoo(...)
{
// bubble up to presenter
OnFoo(..)
}
private void UserControl1_XyzEvent(...)
{
// private interaction (purely about some UI manipulation),
// will not be bubble up to presenter
...
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.