(Шаблон MVP) Как пересылать сообщения об ошибках из Presenter в View? - PullRequest
6 голосов
/ 27 апреля 2009

У меня есть метод, в котором пользователь может искать номер статьи, и если он доступен в базе данных, артикул связывается с BindingList. Теперь я хочу, чтобы пользователь знал, если статья не доступна в базе данных. Как мне сделать это правильно?

Просто передайте сообщение об ошибке сообщению моему методу интерфейса?

Presenter:

string errorMessage;
_view.ErrorMessage(errorMessage);

Вид:

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

Вы бы сделали это так же?

Ответы [ 5 ]

3 голосов
/ 15 января 2010

Мы раздуваем событие. В докладчике вы регистрируете это событие:

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
}

Таким способом вы можете возвращать различные виды состояний обратно в представление, а не только сообщения об ошибках. У нас есть Успех, Ошибка, Заблокировано, Предупреждение, Помощь.

1 голос
/ 17 февраля 2013

Мы не должны заново изобретать колесо ....

Вы должны просто выбросить исключение в вашей модели.

Затем представление будет перехватывать исключение, используя блок try catch.

В «улове» покажите окно сообщения.

1 голос
/ 02 марта 2012

Если его MVP - пассивное представление, то интерфейс представления должен иметь свойство, которое может выглядеть следующим образом:

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 голос
/ 27 апреля 2009

В случае сообщений об ошибках я бы назвал некоторые базовые функции. Таким образом, вы можете выбрать, обновить ли окно статуса слева внизу и / или отобразить модальное окно сообщения.

В докладчике:

_windowManager.NoItemFound(errorMessage)

В диспетчере окон:

_statusBox.Text = errorMessage; MessageBox.Show(errorMessage);
0 голосов
/ 27 апреля 2009

Вот что я делаю.

Другой способ, о котором я читал, - это чтобы модель знала, как показать ошибку (возможно, с помощью ErrorMessagePresenter), чтобы ошибка была отделена от исходного докладчика.

Я не нашел для этого смысла, для меня это всегда заканчивается в докладчике и представлении, реализующем оба интерфейса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...