1

20 を超えるプロパティを持つモデルがあるとします。

それらの一部はユーザーがビューで編集できますが、セキュリティ上の理由から、パスワードなどのデータは隠しフィールドに保持されないため、ビューモデルをコントローラーに投稿すると、一部のプロパティが null になります

あまり多くのコードを書かずにどのプロパティが変更されたかを確認する方法は?

悪いアイデア:

    [HttpPost]
    public ActionResult Edit(BigModel model)
    {
        BigModel old=db.Get(new.id);
        if(model.Property1 !=null && old.Property1 != model.Property1) old.Property1=model.Property1
        if(model.Property2 !=null && old.Property2 != model.Property2) old.Property2=model.Property2
        if(model.Property3 !=null && old.Property3 != model.Property3) old.Property2=model.Property2
        ...
        if(model.Property20 !=null && old.Property20 != model.Property20) old.Property20=model.Property20
    }
4

2 に答える 2

2

ViewModelとAutoMapperのようなものを使用して見てください。AutoMapper を使用すると、ドメイン モデルを取得して、規約に基づくアプローチを使用して他の形式に変換できます。たとえば、ドメイン モデルに Start という DateTime プロパティと Start という ViewModel フィールドがある場合、ドメイン モデルの Start の値が ViewModel の Start に名前の一致に基づいてコピーされます。ドメイン モデルの Start から ViewModel の StartYear など、より複雑なマッピングを行うことができます。

ViewModel には、表示フィールドと投稿するフィールドを組み込む必要があります (おそらく子編集モデルとして)。その後、EditModel にポスト バックします。

EditModel には、更新するフィールドのみが含まれます。これは、ドメイン モデルにマッピングするか、手動で行うことができます。

ここでその概要を見ることができます。このスタックの質問と回答は、テクニックも示しています

于 2013-09-14T22:52:32.687 に答える
1

ビューにある正確なフィールド (非機密フィールド) を含むビューモデルを使用TryUpdateModel(old)してから、ランタイムを呼び出すと、ビューモデルのフィールドがモデルにマップされ、変更されないフィールドについて心配する必要はありません.. EF値が同じ場合、それらを変更済みとしてマークしません。

  [HttpPost]
    public ActionResult Edit(BigViewModel model)
    {
        BigModel old=db.Get(new.id);

        UpdateModel(old);

        //db.SaveChanges();

    }

プロファイラーに投資して、クエリを送信したときにEFが何をしているのか、どのようなSQLを生成しているのかを確認することをお勧めします..ORMプロファイラーまたはEFProfを試すことができます...有料ツールを気にしない場合は、Glimpseを試すことができます(Glimpse.EF)。

于 2013-09-14T23:13:10.640 に答える