2009-04-27 13 views
5

Tengo un método en el que el usuario puede buscar un número de artículo y, si está disponible en la base de datos, el artículo se vincula a una lista de vinculación. Ahora quiero que el usuario sepa si el artículo no está disponible en la base de datos. ¿Cómo lo hago de la manera correcta?(Patrón MVP) ¿Cómo reenviar los mensajes de error del presentador a la vista?

¿Acaba de pasar el mensaje errorMessage a mi método de interfaz?

Presentador:

string errorMessage; 
_view.ErrorMessage(errorMessage); 

Vista:

public void ErrorMessage(string errorMessage) 
{ 
     MessageBox.Show(errorMessage); 
} 

¿Le hacerlo de la misma manera?

Respuesta

0

Eso es lo que hago.

Otra forma que he leído es que el modelo sepa cómo mostrar un error (tal vez por un ErrorMessagePresenter) para que el error se separe del presentador original.

Realmente no he encontrado un uso para eso, para mí, siempre termina en el presentador y ve la implementación de ambas interfaces.

1

En el caso de los mensajes de error, me gustaría llamar a algunas funciones básicas. De esta forma, puede elegir si desea actualizar la ventana de estado en la parte inferior izquierda y/o mostrar un cuadro de mensaje modal.

En el presentador:

_windowManager.NoItemFound(errorMessage) 

En el gestor de ventanas:

_statusBox.Text = errorMessage; MessageBox.Show(errorMessage); 
3

Nos burbuja de un evento. En el presentador se registra este caso:

public event PresenterEventHandler Message; 

Y luego lo levanta así:

PresenterEventArgs pe = new PresenterEventArgs("Error message", Status.Error); 
this.Message(this, pe); 

A continuación, en la vista:

protected override void OnInit(EventArgs e) 
{ 
    this.presenter = new MyPresenter(this, MyBusinessService.Instance); 
    this.presenter.Message += new PresenterEventHandler(presenter_Message); 
} 

void presenter_Message(object sender, PresenterEventArgs pe) 
{ 
    // display error message 
} 

se puede pasar diferentes tipos de estados de nuevo a la vista de esta manera, y no solo los mensajes de error. Tenemos éxito, error, bloqueado, advertencia, ayuda.

+0

Recientemente hice algo similar a esto. Tuve eventos para Error y Advertencias (estos usaron CancelEventArgs) para comentarios del cliente. – Kevin

1

Si su MVP - Pasivo, finalmente, la interfaz de Vista debe tener una propiedad que podía leer:

public interface IViewArticleList { 
    // more stuff here... 
    bool ErrorMessageVisible { set; } 
    string ErrorMessage { set; } 
    // more stuff here... 
    int ArticleNumber { get; } 
} 

public interface IPresenter { 
    public void Update(); 
} 

public class ArticleListPresenter : IPresenter { 
    IViewArticleList _view; 

    public ArticleListPresenter(IViewArticleList view) { 
     this._view = view; 
     // you could update the view here or with an update method, 
     // completely up to you. 
    } 

    // Assuming you are using a fine grained presenter 
    public void HandleArticleNumberSearch() { 
     bool articleNotFound; 
     // whatever, whatever...  
     if (articleNotFound) { 
      this._view.ErrorMessageVisible = true; 
      this._view.ErrorMessage = string.Format("The article #{0} was not found.", number); 
     } 
    } 
} 

public class ArticleList : Page, IArticleListView { 
    ArticleListPresenter _presenter; 

    public bool ErrorMessageVisible { 
     set { this.lblErrorMessage.Visible = value; } 
    } 

    public bool ErrorMessage { 
     set { this.lblErrorMessage.Text = value; } 
    } 

    public int ArticleNumber { 
     // You have to do some sort of validation here, but I'll keep it simple 
     get { return Integer.Parse(this.txtArticleNumber.Text); } 
    } 

    protected override void OnInit(EventArgs e) { 
     this._presenter = new ArticleListPresenter(this); 
    } 

    protected void Page_Load(object sender, EventArgs e) { 
     // this implementation keeps the state in the View, and updates it 
     // in the presenter: Passive View 
     if(!this.IsPostBack) { 
      this._presenter.Update(); 
     } 
    } 

    protected void OnSearchArticleButtonClick(object sender, EventArgs e) { 
     this._presenter.HandleArticleNumberSearch(); 
    } 
} 
1

no hay que reinventar la rueda ....

Usted simplemente debe tirar una excepción en tu modelo.

Luego, la vista atrapará la excepción usando un bloque try catch.

En la "captura", muestre su cuadro de mensaje.

Cuestiones relacionadas