事件冒泡和MVP:ASP.NET [英] Event Bubbling and MVP: ASP.NET

查看:218
本文介绍了事件冒泡和MVP:ASP.NET的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想学习MVP

这是使用Web窗体在ASP.NET中。我有两个用户控件CurrentTimeView.ascx和MonthViewControl.ascx。该CurrentTimeView里显示的时间。有一个文本框加上天在同一控制。新得到的日期被称为结果日期。当点击了添加天按钮,引发事件myBtnAddDaysClickedEvent。

It is using web forms in ASP.NET. I have two user controls CurrentTimeView.ascx and MonthViewControl.ascx. The CurrentTimeView displayes time. There is a textbox to add days in the same control. The newly got date is called "resultant date". When the button is clicked for add days, an event is raised "myBtnAddDaysClickedEvent".

在所述MonthViewControl,存在显示所得日期的月份的标签。在present我设置的变量monthValueToPass的采样值(因为我不知道如何正确地做到这一点)。 如何设置的值monthValueToPass变量,以使其符合MVP的模式?

On the MonthViewControl, there is a label that shows the month of the "resultant date". At present I am setting a sample value for the variable "monthValueToPass" (since I don’t know how to do it properly). How do I set the value for monthValueToPass variable to make it comply with MVP model?

string monthValueToPass = "TEST";
monthPresenter.SetMonth(monthValueToPass);

的期望是创建MVP,很容易做单元测试,并没有违反MVP的木构建筑。

注:虽然这是一个简单的例子,我用的MVP和验证机制,期待一个答案scalablt到绑定在GridView控件

Note: Though this is a simple example, I am expecting an answer scalablt to databinding in GridView control using MVP and validation mechanisms.

注:可以查看是完全独立的presenter

Note: Can view be totally independant of presenter?

注:每个用户的控制是独立的观点在这里

Note: Each user control is separate views here

注:可有对同一presenter多个视图(?像基于thier permisssion各种用户不同的控件)

Note: Can there be multiple views for same presenter (like different controls for various users based on thier permisssion?)

指南

  1. 模型 - 视图 - presenter - 指南

- 完成code -

--COMPLETE CODE--

using System;
public interface ICurrentTimeView
{
    //Property of View
    DateTime CurrentTime 
    {
        set; 
    }


//Method of View
void AttachPresenter(CurrentTimePresenter presenter);

}

using System;
public interface IMonthView
{
//Property of View
string MonthName 
{
    set; 
}

//Method of View
//View interface knows the presenter
void AttachPresenter(MonthPresenter presenter);

}

 using System;
 public class CurrentTimePresenter 
 {
private ICurrentTimeView view;

//Constructor for prsenter
public CurrentTimePresenter(ICurrentTimeView inputView) 
{
    if (inputView == null)
    {
        throw new ArgumentNullException("view may not be null");
    }

    this.view = inputView;
}

//Method defined in Presenter
public void SetCurrentTime(bool isPostBack) 
{
    if (!isPostBack) 
    {
        view.CurrentTime = DateTime.Now;
    }
}

//Method defined in Presenter
public void AddDays(string daysUnparsed, bool isPageValid) 
{
    if (isPageValid) 
    {
        view.CurrentTime = DateTime.Now.AddDays(double.Parse(daysUnparsed));

    }
}

}

using System;
public class MonthPresenter
{

private IMonthView monthView;

//Constructor for prsenter
public MonthPresenter(IMonthView inputView)
{
    if (inputView == null)
    {
        throw new ArgumentNullException("view may not be null");
    }

    this.monthView = inputView;
}


//Method defined in Presenter
//How does presenter decides the required value.
public void SetMonth(string monthValueInput) 
{
    if (!String.IsNullOrEmpty(monthValueInput))
    {
        monthView.MonthName = monthValueInput;
    }
    else
    {

    }


}

}

用户控制1

<%@ Control Language="C#" AutoEventWireup="true" CodeFile="CurrentTimeView.ascx.cs" Inherits="Views_CurrentTimeView" %>







using System;
using System.Web.UI;
public partial class Views_CurrentTimeView : UserControl, ICurrentTimeView
{
//1. User control has no method other than view defined method for attaching presenter
//2. Properties has only set method

private CurrentTimePresenter presenter;

// Delegate 
public delegate void OnAddDaysClickedDelegate(string strValue);

// Event 
public event OnAddDaysClickedDelegate myBtnAddDaysClickedEvent;


//Provision for getting the presenter in User Control from aspx page.
public void AttachPresenter(CurrentTimePresenter presenter)
{
    if (presenter == null)
    {
        throw new ArgumentNullException("presenter may not be null");
    }
    this.presenter = presenter;
}

//Implement View's Property
public DateTime CurrentTime
{
    set
    {
        //During set of the property, set the control's value
        lblCurrentTime.Text = value.ToString();
    }
}


//Event Handler in User Control
protected void btnAddDays_OnClick(object sender, EventArgs e)
{
    if (presenter == null)
    {
        throw new FieldAccessException("presenter null");
    }

    //Ask presenter to do its functionality
    presenter.AddDays(txtNumberOfDays.Text, Page.IsValid);


    //Raise event
    if (myBtnAddDaysClickedEvent != null)
    {
        myBtnAddDaysClickedEvent(string.Empty);
    }


}

}

用户控制2

<%@ Control Language="C#" AutoEventWireup="true" CodeFile="MonthViewControl.ascx.cs" Inherits="Views_MonthViewControl" %>

using System;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

public partial class Views_MonthViewControl : System.Web.UI.UserControl, IMonthView
{
//1. User control has no method other than view defined method for attaching presenter
//2. Properties has only set method

private MonthPresenter presenter;

//Provision for gettng the presenter in User Control from aspx page.
public void AttachPresenter(MonthPresenter presenter)
{
    if (presenter == null)
    {
        throw new ArgumentNullException("presenter may not be null");
    }
    this.presenter = presenter;
}

//Implement View's Property
public string MonthName
{
    set
    {
        //During set of the popert, set the control's value
        lblMonth.Text = value.ToString();
    }
}

protected void Page_Load(object sender, EventArgs e)
{

}

}

aspx页面

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="ShowMeTheTime.aspx.cs"      Inherits="ShowTime" %>

<%@ Register TagPrefix="mvpProject" TagName="CurrentTimeView" Src="Views/CurrentTimeView.ascx" %>

<%@ Register TagPrefix="month" TagName="MonthView" Src="Views/MonthViewControl.ascx" %>

    页面标题     

PAGE TITLE

    <mvpProject:CurrentTimeView id="ucCtrlcurrentTimeView" runat="server" />
    <br />
    <br />
    <month:MonthView id="ucCtrlMonthView" runat="server" />

</form>

using System;
using System.Web.UI;

public partial class ShowTime : Page
{
CurrentTimePresenter currentTimePresenter;
MonthPresenter monthPresenter;

protected void Page_Load(object sender, EventArgs e) 
{
    HelperInitCurrentTimeView();
    HelperInitMonth();
}

private void HelperInitMonth()
{
    //Create presenter
    monthPresenter = new MonthPresenter(ucCtrlMonthView);

    //Pass the presenter object to user control
    ucCtrlMonthView.AttachPresenter(monthPresenter);

}

private void HelperInitCurrentTimeView() 
{
    //Cretes presenter by passing view(user control) to presenter.
    //User control has implemented IView
    currentTimePresenter = new CurrentTimePresenter(ucCtrlcurrentTimeView);

    //Pass the presenter object to user control
    ucCtrlcurrentTimeView.AttachPresenter(currentTimePresenter);

    //Call the presenter action to load time in user control.
    currentTimePresenter.SetCurrentTime(Page.IsPostBack);

    //Event described in User Control ???? Subsribe for it.
    ucCtrlcurrentTimeView.myBtnAddDaysClickedEvent += new Views_CurrentTimeView.OnAddDaysClickedDelegate(CurrentTimeViewControl_AddButtonClicked_MainPageHandler);


}


void CurrentTimeViewControl_AddButtonClicked_MainPageHandler(string strValue)
{
    string monthValue = "l";
    monthPresenter.SetMonth("SAMPLE VALUE");
    //myGridCntrl.CurentCharacter = theLetterCtrl.SelectedLetter;
    //myGridCntrl.LoadGridValues();
}

}

一些MVP的讨论:

模型 - 视图 - presenter - 指南

在MVP在哪里写的验证

<一个href="http://stackoverflow.com/questions/2203906/mvp-should-views-be-able-to-call-$p$psenter-methods-directly-or-should-they-alw">MVP - 如果意见能够直接调用presenter方法​​还是应该总是引发事件

MVP事件或财产

将在MVP模式 - 活动

MVP - 如果presenter使用Session

<一个href="http://stackoverflow.com/questions/4732490/why-do-$p$psenters-attach-to-view-events-instead-of-view-calling-$p$psenter-method">Why做presenters附加到查看事件,而不是调用查看大多数ASP.NET MVP实现presenter方法​​?

<一个href="http://stackoverflow.com/questions/1012069/mvp-public-methods-or-subscribe-to-view-events">Public方法或订阅查看事件

MVP模式,有多少意见,以一个presenter?

MVP和用户控件和调用

<一个href="http://stackoverflow.com/questions/5538813/asp-net-web-forms-model-view-$p$psenter-and-user-">ASP.NET Web窗体 - 模型 - 视图 - presenter和用户控件的 控制

<一个href="http://stackoverflow.com/questions/2718864/restrict-violation-of-architecture-asp-net-mvp">Restrict违反建筑 - asp.net MVP

<一个href="http://stackoverflow.com/questions/8339303/control-modification-in-$p$psentation-layer">Control修改在presentation层

<一个href="http://stackoverflow.com/questions/2578750/decoupling-the-view-$p$psentation-and-asp-net-">Decoupling看来,presentation和ASP.NET Web窗体 网页表单

推荐答案

感谢您的投入。我提到MVP快速入门 http://msdn.microsoft.com/en-us/library /ff650240.aspx 模型可以提高事件。我想,我应该用这种方法去。任何想法是值得欢迎的。

Thanks for the inputs. I referred MVP Quickstarts http://msdn.microsoft.com/en-us/library/ff650240.aspx. Model can raise events. I think, I should go with that approach. Any thoughts are welcome.

另外,我已经发布 HTTP:/ /forums.asp.net/t/1760921.aspx/1?Model+View+$p$psenter+Guidelines 以收集有关MVP的一般规则。

Also, I have posted http://forums.asp.net/t/1760921.aspx/1?Model+View+Presenter+Guidelines to collect general rules on MVP.

引用

开发presenter它可以与View和Model沟通。   presenter可能只有看接口的知识。即使   混凝土视图的改变,它不会影响presenter

Develop Presenter which can communicate with both View and Model. Presenter may only have knowledge of view interfaces. Even if the concrete view changes, it does not affect presenter.

在具体看来,控件的事件处理程序可以简单的叫   presenter方法​​或引发事件到presenter将有   认购。应当有书面中没有presentation规则/逻辑   具体的看法。

In the concrete view, control’s event handlers will simply call presenter methods or raise events to which presenter would have subscribed. There should be no presentation rule/logic written in concrete view.

presenter应该有模式的唯一接口对象;没有具体的   模型。这是为了便于单元测试

Presenter should have only interface object of model; not concrete model. This is for the ease of Unit Testing

查看可以参照实体企业。不过应该没有逻辑   与该实体对象中写入相关联。它可能只是通过   实体对象以presenter。

View can refer business entities. However there should no logic written associated with the entity objects. It may just pass the entity object to presenter.

查看界面应该是一个抽象的概念。它不应该有任何   控制或的System.Web参考。在具体视图中,应该没有   法比定义的接口方法等。

View interface should be an abstraction. It should NOT have any control or System.Web reference. In concrete view, there should be no method other than interface defined methods.

模型从来不知道有关具体的看法,以及对   接口视图

The "Model" never knows about the concrete view as well as the interface view

模型可以定义并引发事件。 presenter可以订阅这些   事件提出的模型。

"Model" can define and raise events. Presenter can subscribe these events raised by model.

在presenter公共方法应该是无参数。查看对象   要访问presenter只无参数的方法。另一种选择   是认为可以定义事件,其中presenter可以订阅。无论是   这样,不应该有任何参数传递。

Public methods in presenter should be parameterless. View object should access only parameterless methods of presenter. Another option is view can define events to which the presenter can subscribe. Either way, there should be no parameter passing.

由于该模型具有所需的所有值(被存回   数据库),就没有必要通过任何值从视图来模拟(最   的时间)。例如。当一个项目只在下拉列表中选择   对照目前的指数需要传递模型。然后,模型知道   如何得到相应的域值。在这种情况下,视图   不需要通过任何presenter。 presenter知道如何获得价值   从视图中。

Since the model has all the required values (to be stored back in database), there is no need to pass any value to model from view (most of the time). E.g. when an item is selected in dropdown list only the controls’ current index need to be passed to model. Then model knows how to get the corresponding domain values. In this case, the view need not pass anything to presenter. Presenter knows how to get value from view.

查看可以使用的模型直接(不使用presenter)。例如。   ObjectDataSource的SelectMethod。但是,控制器从不知道的   具体来看,以及接口视图。

View may make use of model directly (without using presenter). E.g. ObjectDataSource's SelectMethod. But controller never knows about the concrete view as well as the interface view.

在presenter引用视图界面,​​而不是观点的   具体实施。这使您可以更换实际的视图   使用模拟视图运行单元测试时。

The presenter references the view interface instead of the view's concrete implementation. This allows you to replace the actual view with a mock view when running unit tests.

这篇关于事件冒泡和MVP:ASP.NET的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆