Event Bubbling y MVP: ASP.NET

Estoy tratando de aprender MVP

Está utilizando formularios web en ASP.NET. Tengo dos controles de usuario CurrentTimeView.ascx y MonthViewControl.ascx. CurrentTimeView muestra el tiempo. Hay un cuadro de texto para agregar días en el mismo control. La fecha recién obtenida se llama "fecha resultante". Cuando se hace clic en el botón para agregar días, se genera un evento "myBtnAddDaysClickedEvent".

En MonthViewControl, hay una etiqueta que muestra el mes de la "fecha resultante". Actualmente estoy estableciendo un valor de muestra para la variable "monthValueToPass" (ya que no sé cómo hacerlo correctamente). @ ¿Cómo configuro el valor de la variable monthValueToPass para que cumpla con el modelo MVP?

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

La expectativa es crear MVP que sea fácil de hacer Unit Testing y no viole MVP architecure.

Nota: Aunque este es un ejemplo simple, espero una respuesta escalable al enlace de datos en el control GridView usando MVP y mecanismos de validación.

Nota: ¿Puede la vista ser totalmente independiente del presentador?

Nota: cada control de usuario tiene vistas separadas aquí

Nota: ¿Puede haber múltiples vistas para el mismo presentador (como diferentes controles para varios usuarios en función de su permiso)?

PAUTAS

Model View Presenter - Directrices

- 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
    {

    }


}

}

Control de usuario 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);
    }


}

}

Control de usuario 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 Página

<%@ 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 DE LA 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();
}

}

Algunas discusiones de MVP:

Model View Presenter - Directrices

En MVP dónde escribir validaciones

MVP: ¿Deben las vistas poder llamar directamente a los métodos de presentador o siempre deben generar eventos?

MVP eventos o propiedad

El modelo en MVP - Eventos

MVP: ¿el presentador debe usar la sesión?

¿Por qué los presentadores se adjuntan a Ver eventos en lugar de Ver métodos de presentador de llamadas en la mayoría de las implementaciones ASP.NET MVP?

Métodos públicos o suscríbase para ver eventos

MVP patrón, ¿cuántas visitas a un presentador?

MVP y UserControls e invocación

ASP.NET Web Forms - Presentador de vista de modelo y controles de usuario control

Restringir la violación de la arquitectura - asp.net MVP

Modificación de control en la capa de presentación

Desacoplamiento de la vista, presentación y formularios web ASP.NET formularios web

Respuestas a la pregunta(6)

Su respuesta a la pregunta