C# ASP.NETMVP模式
我正在尝试在我的应用程序中实现模型视图演示器设计模式。 MVP模式的一般概念对我来说是众所周知的,但我更努力使用嵌套的用户控件来完成它 我有一些可能的方案可以实现,但在此之前,我想听听你的意见 我认为发布我的任何代码都无关紧要,因为这更像是我试图理解的一个“概念” 因此,情况是: 用于连接2个用户控件的1页。其中一个usercontrol包含子usercontrol。在这种情况下,我如何处理MVP模式C# ASP.NETMVP模式,c#,asp.net,design-patterns,mvp,C#,Asp.net,Design Patterns,Mvp,我正在尝试在我的应用程序中实现模型视图演示器设计模式。 MVP模式的一般概念对我来说是众所周知的,但我更努力使用嵌套的用户控件来完成它 我有一些可能的方案可以实现,但在此之前,我想听听你的意见 我认为发布我的任何代码都无关紧要,因为这更像是我试图理解的一个“概念” 因此,情况是: 用于连接2个用户控件的1页。其中一个usercontrol包含子usercontrol。在这种情况下,我如何处理MVP模式 1 Page 1 UC 1 UC 1 SubUC 编辑: 所以基本上我想知
1 Page
1 UC
1 UC
1 SubUC
编辑:
所以基本上我想知道的是我们如何在两个用户控件中使用MVP在两个视图(父视图和子视图)之间进行交互
我将向您展示一个在ASP.net中没有MVP的示例:
现在有了MVP,我们是否仍然使用CodeBehind注册此类事件?知道这个父用户控件和子用户控件都将使用MVP模式。或者演示者是否在该交互中包含了
最终,我可以将代码更改为:
但考虑到MVP模式,我想知道这是否合适
还是我们更需要这样的方法:
以上所有示例都写在父视图的CodeBehind中。其中一个是正确的吗?如果没有,我们如何使用更好的方法实现这一点
编辑2:我已在以下位置使用示例方法添加了一个解决方案:
我想这应该是我想要的 我看不出有什么问题-用户控件只是一个视图。演示者可以同时与多个视图交互。因此,在这种情况下,演示者可以引用4个视图(一个用于页面,两个用于用户控件,最后一个用于子用户控件) 或者,您希望每个演示者有一个视图,在这种情况下,您可以将用户控件视为父视图(页面)的子视图,因此父视图需要为演示者提供上下视图交互。但是,我更喜欢早期的方法,即演示者处理多个视图的交互 请参见关于如何布线的相关问题: 最后,您可能想看看MVVM模式,我认为它对组合UI非常有用。您将拥有控制视图和模型之间交互的视图模型,而不是presenter-但是,与presenter不同,视图模型不了解视图-而视图观察(并更新)视图模型以进行自身渲染。请参阅本文(视图模型称为表示模型): 编辑: 老实说,我不喜欢你的任何方法。我喜欢MVP实现,其中presenter通过接口(无紧耦合)持有对视图的引用,视图进行连接,即创建presenter实例并注入视图引用。演示者侦听view事件并在view上调用方法。视图从不直接调用演示者的方法。(MVP的其他变体也是可能的——请参见我所寻求的答案)。在这里,我将解释我之前解释的两种方法 方法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);
}
...
}
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
...
}
}
其基本思想是,视图不会产生相声。若用户控件需要通知页面一些事情,它将引发一个事件,演示者将捕获该事件并通知页面。视图是被动的,可以处理UI
方法2:
用户控件和页面进行交互。在这种情况下,页面将充当最终视图,演示者将保留对它的引用。控件的事件将由page处理,如有必要,page将使事件冒泡。比如说,
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);
}
...
}
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
...
}
}
我不完全确定你到底有什么问题?MVP模式和用户控件之间的关系到底是什么?请参见MVP模式的一个简短示例:关系?MVP模式可以在用户控件中使用,就像在页面中一样。你提供的这个链接甚至没有提到用户控件?所以我想要实现的是在我的UserControls中实现MVP模式。仅供参考:我知道MVP是如何工作的,我不是在问如何设置它。。。我在寻求使用嵌套用户控件的最佳实践。我知道MVVM是如何工作的,但我在这里使用的是MVP。正如我所说的,我也知道MVP是如何工作的,我只是有点困惑于如何将不同的用户控件彼此连接起来。谢谢你的回答,但这并不能真正回答我的问题。我不是在寻找如何设置MVP,而是如何使用MVP和它们的交互来处理多个用户控件。(子UserControls的事件等)如果我要为每个UserControls使用1个view/1 Presenter,我如何使用子UserControls?我是否在父级的演示者中初始化子级控制其演示者?然后,最终,我如何从子级向父级通信。。。如果没有MVP,我会使用CodeBehind文件中的事件来实现这一点。但这在与MVP合作时仍然是一样的吗?我会把我的帖子改成更多clear@FrederikPrijck,请参阅我的编辑以了解我的建议。U说:“老实说,我不喜欢你的任何方法。我喜欢MVP实现,其中演示者通过接口(无紧耦合)引用视图”,只是为了澄清。。。我正在使用一个界面,我只是没有粘贴,因为这不是问题的一部分,我不喜欢你们两种方法,因为我希望我的两个视图分别运行。。。如果两个视图不需要单独运行,我会选择您的第一个选项。但由于我希望视图1及其演示者独立于视图2及其演示者工作。。。所以我想我需要你的第一个例子的修改版本。。。