C# ASP.NETMVP模式

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 编辑: 所以基本上我想知

我正在尝试在我的应用程序中实现模型视图演示器设计模式。 MVP模式的一般概念对我来说是众所周知的,但我更努力使用嵌套的用户控件来完成它

我有一些可能的方案可以实现,但在此之前,我想听听你的意见

我认为发布我的任何代码都无关紧要,因为这更像是我试图理解的一个“概念”

因此,情况是:

用于连接2个用户控件的1页。其中一个usercontrol包含子usercontrol。在这种情况下,我如何处理MVP模式

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及其演示者工作。。。所以我想我需要你的第一个例子的修改版本。。。