2014-10-30 44 views
0

在ASP.NET 4.5 Web窗体应用程序中使用Web Forms MVP框架时,如何从该页面的Presenter对象内获取对页面的ModelStateDictionary对象的引用?如何从Web窗体MVP Presenter中获取对Web窗体的ModelStateDictionary的引用?

我希望我的演示者能够在出现问题时设置模型状态错误。例如:尝试插入违反UNIQUE约束条件的记录时出错。

try 
{ 
    dbcontext.SaveChanges(); 
} 
catch (DbUpdateException updateException) 
{ 
    // how to get a reference to the model state? 
    ModelStateDictionary state = null; 

    // add the error to the model state for display by the view 
    state.AddModelError("key", updateException.GetBaseException().Message); 
} 

甲谷歌搜索“webformsmvp presenter modelstatedictionary”产生的相关结果的低得惊人数量。

回答

0

一种方法是将模型状态从视图传递给演示者作为事件参数。

首先,EventArgs类:

public class ModelStateEventArgs : EventArgs 
{ 
    public ModelStateEventArgs(ModelStateDictionary modelState) 
    { 
     this.ModelState = modelState; 
    } 

    public ModelStateDictionary ModelState { get; private set; } 
} 

从这个类派生的,如果你需要更多的事件参数


然后,由视图实现IView

public interface IDataContextView : IView<DataContextVM> 
{ 
    event EventHandler<ModelStateEventArgs> Update; 
} 

在视图本身引发事件:

  • MvpPage意见

    this.Update(this, new ModelStateEventArgs(this.ModelState)); 
    
  • MvpUserControl意见

    this.Update(this, new ModelStateEventArgs(this.Page.ModelState)); 
    

最后, Presenter,它可以订阅Update事件并获取每个事件发生时的模型状态:

public class DataContextPresenter : Presenter<IDataContextView> 
{ 
    public DataContextPresenter(IDataContextView view) 
     : base(view) 
    { 
     this.View.Update += OnUpdating(); 
    } 

    private void OnUpdating(object sender, ModelStateEventArgs e) 
    { 
     var entity = ConvertViewModelToEntity(this.View.Model); 
     dbcontext.Entry(entity).State = EntityState.Modified; 
     try 
     { 
      dbcontext.SaveChanges(); 
     } 
     catch (DbUpdateException updateException) 
     { 
      // add the error to the model state for display by the view 
      e.ModelState.AddModelError(string.Empty, updateException.GetBaseException().Message); 
     } 
    } 
}