0

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

我希望我的演示者能够在出现问题时设置模型状态错误。例如:尝试插入违反 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 ”产生的相关结果数量少得惊人。

4

1 回答 1

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);
        }
    }
}
于 2014-10-31T07:58:19.750 回答