2009-04-27 8 views
5

J'ai une méthode où l'utilisateur peut rechercher un numéro d'article et s'il est disponible dans la base de données, le numéro d'article est lié à un BindingList. Maintenant, je veux que l'utilisateur sache si l'article n'est pas disponible dans la base de données. Comment puis-je faire cela de la bonne façon?(MVP Pattern) Comment transférer les messages d'erreur de Presenter à View?

Il suffit de passer le message errorMessage à ma méthode d'interface?

Présentateur:

string errorMessage; 
_view.ErrorMessage(errorMessage); 

Vue:

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

-vous le faire de la même façon?

Répondre

0

C'est ce que je fais. Une autre façon que j'ai lu à propos de serait pour le modèle de savoir comment afficher une erreur (peut-être par un ErrorMessagePresenter) de sorte que l'erreur est détachée du présentateur d'origine.

Je n'ai pas vraiment trouvé d'utilisation pour ça, pour moi, ça se termine toujours par le présentateur et la visualisation implémentant les deux interfaces.

1

Dans le cas de messages d'erreur, j'appellerais une fonctionnalité de base. De cette façon, vous pouvez choisir de mettre à jour la fenêtre d'état en bas à gauche et/ou d'afficher une boîte de message modale.

Dans le présentateur:

_windowManager.NoItemFound(errorMessage) 

Dans le gestionnaire de fenêtres:

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

Nous bubble un événement. Dans le présentateur vous enregistrez cet événement:

public event PresenterEventHandler Message; 

Et puis soulevez-le comme suit:

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

Puis dans la vue:

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 
} 

Vous pouvez passer différents types de statuts de retour à la vue de cette manière, et pas seulement les messages d'erreur. Nous avons succès, erreur, verrouillé, avertissement, aide.

+0

Récemment, j'ai fait quelque chose de similaire. Avait des événements pour Error et Warnings (ils ont utilisé CancelEventArgs) pour les commentaires du client. – Kevin

1

Si le MVP - Voir passif, l'interface de visualisation doit avoir une propriété qui pourrait lire:

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

Il ne faut pas réinventer la roue ....

Vous devriez simplement jeter une exception dans votre modèle. Ensuite, la vue attrape l'exception à l'aide d'un bloc try catch.

Dans la "capture", affichez votre boîte de message.

Questions connexes