Event Bubbling e MVP: ASP.NET

Estou tentando aprender MVP

Está usando formulários da web no ASP.NET. Eu tenho dois controles de usuário CurrentTimeView.ascx e MonthViewControl.ascx. O CurrentTimeView exibe a hora. Há uma caixa de texto para adicionar dias no mesmo controle. A data recém-obtida é chamada de "data resultante". Quando o botão é clicado para adicionar dias, um evento é exibido "myBtnAddDaysClickedEvent".

No MonthViewControl, há um rótulo que mostra o mês da "data resultante". No momento, estou definindo um valor de amostra para a variável "monthValueToPass" (já que não sei como fazer isso corretamente).Como faço para definir o valor da variável monthValueToPass para torná-lo compatível com o modelo MV

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

expectativa é criar MVP que seja fácil de realizar testes de unidade e que não viole a arquitetura do MV

ota: Embora este seja um exemplo simples, estou esperando uma resposta escalável à ligação de dados no controle GridView usando MVP e mecanismos de validaçã

ota: A visualização pode ser totalmente independente do apresentado

ota: Cada controle de usuário tem visões separadas aqui

ota: Pode haver várias visualizações para o mesmo apresentador (como controles diferentes para vários usuários com base em sua permissão

GUIDELINES

Modelo View Presenter - Diretrizes

- CÓDIGO COMPLETO -

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
    {

    }


}

}

Controle do Usuário 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);
    }


}

}

Controle do Usuário 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

<%@ 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" %>

TÍTULO DA PÁGIN

    <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();
}

}

Algumas discussões sobre MVP:

Modelo View Presenter - Diretrizes

No MVP, onde escrever validações

MVP - As visualizações devem poder chamar métodos do apresentador diretamente ou devem sempre gerar evento

ventos ou propriedade do MVP

O Modelo no MVP - Eventos

MVP - O apresentador deve usar a sessão?

Por que os apresentadores se conectam aos eventos View em vez de View chamando métodos Presenter na maioria das implementações do ASP.NET MV

Public Methods ou inscreva-se em Visualizar eventos

Padrão MVP, quantas visualizações para um apresentado

MVP e UserControls e invocação

ASP.NET Web Forms - Apresentador do Model View e controles de usuário controls

Restringir violação da arquitetura - asp.net MVP

odificação de controle na camada de apresentaç

Desacoplando a visualização, apresentação e ASP.NET Web Forms formulários da web

questionAnswers(3)

yourAnswerToTheQuestion