我有一种方法,用户可以在其中搜索文章编号,如果在数据库中可用文章编号绑定到BindingList。现在我想让用户知道文章是否在数据库中不可用。我该怎么做正确的方法?
只需将消息errorMessage传递给我的接口方法?
主讲人:
string errorMessage;
_view.ErrorMessage(errorMessage);
查看:
public void ErrorMessage(string errorMessage)
{
MessageBox.Show(errorMessage);
}
你会以同样的方式做吗?
答案 0 :(得分: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
}
您可以通过这种方式将不同类型的状态传递回视图,而不仅仅是错误消息。我们有成功,错误,锁定,警告,帮助。
答案 1 :(得分:1)
在出现错误消息的情况下,我会调用一些基本功能。这样你就可以选择更新左下角的状态窗口和/或显示模态消息框。
在演示者中:
_windowManager.NoItemFound(errorMessage)
在窗口管理器中:
_statusBox.Text = errorMessage; MessageBox.Show(errorMessage);
答案 2 :(得分:1)
如果它的MVP - Passive View,那么View界面应该有一个可以读取的属性:
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();
}
}
答案 3 :(得分:1)
我们不应该重新发明轮子......
您只需在模型中抛出异常。
然后,视图将使用try catch块捕获异常。
在“catch”中,显示您的留言框。
答案 4 :(得分:0)
这就是我的工作。
我读过的另一种方法是让模型知道如何显示错误(可能是通过ErrorMessagePresenter),以便错误与原始演示者分离。
我还没有真正找到它的用途,对我来说,它始终以演示者和视图实现两个接口结束。