繁体   English   中英

ASP.NET MVP模式

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM