0

ASP.NET 4.5 Web フォーム アプリケーションでWeb フォーム MVPフレームワークを使用して、そのページのオブジェクト内からページのModelStateDictionaryオブジェクトへの参照を取得するにはどうすればよいPresenterですか?

何か問題が発生した場合に、プレゼンターがモデル状態エラーを設定できるようにしたいと考えています。例: 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 」を Google 検索すると、驚くほど少ない数の関連する結果が得られます。

4

1 に答える 1

0

1 つの方法は、モデルの状態をビューからプレゼンターにイベント引数として渡すことです。

まず、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 に答える