Day: August 28, 2008

Event wire up in MVP

I was struggling in MVP eventhandler for a long time. What is the correct way to link view events with presenter method. Before I used to simply put the presenter method code directly into my UI control’s event, as the example shown in Billy McCafferty,

protected void btnAddDays_OnClick(object sender, EventArgs e)
{
presenter.AddDays(txtNumberOfDays.Text, Page.IsValid);
}

This is OK but I think this needs UI developer know more about presenter’s behaviors, what if  presenter has many methods? Alex Mueller gave out a nice solution by introducing EventHandler in view, which I like it better. In fact, Billy is doing the similar thing but it’s in another way, eventHandler in presenter to enable view hooking up to, this causes the view coding a little bit heavier. Don’t we always want to keep view thinner?

protected void Page_Load(object sender, EventArgs e)
{
EditProjectPresenter presenter =
new EditProjectPresenter(editProjectView);
// I think this code should move into presenter’s constructor. Like Alex Mueller did.
presenter.ProjectUpdated += new EventHandler(HandleProjectUpdated);
presenter.InitView();
}

private void HandleProjectUpdated(object sender, EventArgs e)
{
Response.Redirect(
MyPageMethods.ShowProjectSummary.Show(projectId, userId));
}

I also like Alex’s name covention for eventhandler in MVP.

View         Presenter

RequestAction     ActionListener

When I played his code in VS2008, those null check and extra declaration seem not necessary any more. Instead of doing this:


protected void btnEdit_Click(object sender, EventArgs e)
{
// Raise our event
OnRequestCustomerEdit();
}
public event EventHandler RequestCustomerDetails;
public virtual void OnRequestCustomerEdit()
{
EventHandler<SingleValueEventArgs<string>> eventHandler = RequestCustomerEdit;
if (eventHandler != null)
{
eventHandler(this, null);
}
}

I can now make it much simplier:

btnEdit_Click +=    RequestCustomerDetails;

Not sure is it correct yet. I will update when I found new problem for this.