6

我有一个方法,用户可以搜索文章编号,如果它在数据库中可用,则文章编号绑定到 BindingList。现在我想让用户知道该文章是否在数据库中不可用。我该如何以正确的方式做到这一点?

只需将消息 errorMessage 传递给我的接口方法?

主持人:

string errorMessage;
_view.ErrorMessage(errorMessage);

看法:

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

你会这样做吗?

4

5 回答 5

3

我们冒泡一个事件。在演示者中,您注册该事件:

public event PresenterEventHandler Message;

然后像这样提高它:

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

然后在视图中:

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
}

您可以通过这种方式将不同类型的状态传递回视图,而不仅仅是错误消息。我们有成功、错误、锁定、警告、帮助。

于 2010-01-15T17:35:37.503 回答
1

在出现错误消息的情况下,我会调用一些基本功能。这样,您可以选择是否更新左下角的状态窗口和/或显示模式消息框。

在演示者中:

_windowManager.NoItemFound(errorMessage)

在窗口管理器中:

_statusBox.Text = errorMessage; MessageBox.Show(errorMessage);
于 2009-04-27T12:08:36.387 回答
1

如果它的 MVP - Passive View,那么 View 接口应该有一个可以读取的属性:

public interface IArticleListView {
    // 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(IArticleListView 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;
        // search for the article ...    
        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();
    }
}
于 2012-03-02T07:23:36.963 回答
1

我们不应该重新发明轮子......

你应该简单地在你的模型中抛出一个异常。

然后,视图将使用 try catch 块捕获异常。

在“catch”中,显示您的消息框。

于 2013-02-17T09:02:58.297 回答
0

我就是做这个的。

我读过的另一种方法是让模型知道如何显示错误(可能通过 ErrorMessagePresenter),以便将错误与原始演示者分离。

我还没有真正找到它的用途,对我来说,它总是以演示者和实现这两个接口的视图结束。

于 2009-04-27T11:50:17.957 回答