15

次の[HttpPost]ようなアクション メソッド シグネチャがあります。

[HttpPost]
public ActionResult Edit(ExistingPostViewModel model)
{
   // Save the edited Post.
}

さて、過去に(R&DなどのViewModelを使用していなかったとき)、次のようなEditメソッドの実装がありました:

[HttpPost]
public ActionResult Edit(Post model)
{
    var existingPost = repo.Find(model.Id);
    TryUpdateModel(existingPost);
    repo.Save(existingPost);  
    return RedirectToAction("Success", existingPost.Id);
}

これはうまくいきました。

しかし、上記をViewModelアプローチに適応させる方法がわかりません。

私がこれを行う場合:

TryUpdateModel(existingPost)

私の ViewModel アプローチでは、あまり起こりません。Postエラーはありませんが、MVC は aから aを更新する方法がわからないため( ->ExistingPostViewModelになる前)、何も更新されていません。PostPost

今、私は AutoMapper を使用しています。したがって、ViewModel から にマップしてPost、投稿を保存できると考えました。

しかし、基本的にすべてをオーバーライドします。これはやりたくないことであり、ビューモデルのカットダウンのポイントを無効にします。

誰でも私を混乱させることができますか?

これは非常に一般的なシナリオのように思えます。人々がこれをどのように解決するかについて、私は完全に困惑しています。考えられる解決策は 3 つしかありません。

  1. HTTP POST で ViewModel を使用しないでください。私が言ったように、私は過去に研究開発のためにこれを行い、それは機能しましたが、今では私のビューがどのように進化したか (検証、シンプルさ) がわかり、この問題のためだけにそれを妥協することはできません.

  2. TryUpdateModel を使用しないでください。おそらくですが、どうすれば変更をマージできますか?

  3. 左から右に使用します。うーん。しかし、現時点では、これが私が傾いている方法のようです。

誰か私に解決策#4を教えてください!:)

ところで、私は ASP.NET MVC 3、Razor、および Entity Framework を使用しています。

4

3 に答える 3

2

私が現在取り組んでいるプロジェクトで、実際にこれとまったく同じ問題に遭遇しました。私はそれが好きではありませんでしたが、最終的には左から右へのアプローチを行い、ビューモデル データをエンティティに手動でマッピングしました。

このアプローチの唯一の利点は、より詳細に制御できることです。ビューモデルに複数のエンティティからのフィールドが実際にある、より複合的なビューモデルを使用し始めてから、この方法で物事を行うことがより理にかなっているようになりました。

私も AutoMapper を使用しています。その通りです。単純な更新操作をしようとすると、ぎこちなくなります。非常に巧妙な回避策があればいいのですが、「昔ながらの方法」が、私が行ってきた仕事に最も適しているようです。

于 2011-05-05T12:41:45.280 に答える
1

これが役立つかどうかはわかりませんが、私にとってはうまくいっています。基礎となるドメイン テーブルを訪問者オブジェクトとして持っています。私のビューモデルには、ビジター オブジェクトと、ドロップダウン用の IEnumerables がいくつか含まれています。

    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Edit(int id)

    {
        Visitor Visitor = new Visitor();
        Visitor = db.Visitors.FirstOrDefault(v => v.VisitorID == id);

        UpdateModel(Visitor, "Visitor");

        db.SaveChanges();
        return RedirectToAction("Index");

    }

UpdateModel は、比較する値を伝える「Visitor」文字列のため、ビューモデルから外れて機能します。

于 2016-04-18T20:01:26.390 に答える
0

更新を実装する前にコントロールを実行する必要がない単純なことについては、実行していることは問題ありません (db.get() を実行してから更新します)。

事態が複雑になると、エンティティを読み込んでから、プロパティごとにビュー モデルからユーザーの変更を選択して適用する必要があります。そのような場合、新しいデータを入力として取得する Update メソッドを作成してから、既存のエンティティを読み込み、状態を比較して、ビュー モデル データに基づいて必要なアクションを実行します。実際、この場合、おそらく Update メソッドはありませんが、CancelPost、AddComment、EditPost (編集理由もログに記録します)、AddTagsToPost などの動作があります。

于 2011-05-05T12:58:12.760 に答える