1

だから、私はこれがMVC3の前のプロジェクトで機能しているのを見たので、a)私がそれを台無しにしたのか、b)MVC4が何か違うことをしているのか(そうなるとは思えない)疑問に思います。

私は、コントローラーアクションメソッドにサブミットするモデルバインドされたRazorビューを持っています(MVCの場合と同様)

アクション後の方法:

[HttpPost]
[AutoMap(typeof(MyViewModel), typeof(MyDomainObj))]
public void PostAction(MyDomainObj obj)
{... etc.. etc.. 

アクションフィルターは、最終的に次のようなことを行います。

public override void OnActionExecuting(ActionExecutingContext filterContext)
{
    var model = filterContext.Controller.ViewData.Model;

注:Jimmy Bogardの例では、私も試したOnActionExecutedを使用しました。

私が抱えている重要な問題は、コンテキストから「モデル」変数を取得するポイントでは、それがnullであるということです。デバッグ中にfilterContext.ActionParametersを見ると、MyDomainObjインスタンスが表示されます。これは(MyViewModelタイプと共通のプロップ名を持っているため)私のフォームデータからマッピングされているように見えます!

したがって、はい。このメソッドのパラメーターとしてMyViewModelタイプを使用した場合、パラメーターは送信されたフォームから適切に入力されます。だが。私はそれをしたくありません、私は実行された/実行されたアクションの一部としてビューモデルをドメインモデルに変換したいと思います(そして以前はJBの簡潔なハウツーに基づいて行いました)そしてそれからちょうど私の保存を押すことができましたドメインモデル。

まとめ-アクション後のフィルターでViewData.Modelがnullになるのはなぜですか?

4

1 に答える 1

0

Jimmmy はまた、投稿アクションの実装方法についていくつかのアイデアを持っています。また、別の男 Matt Honeycutt も投稿の実行方法について彼の見解を共有しています。また、ジミーは get リクエストで属性ではなく明示的なマッピングを使用する方向に進んでいると思います。これは、マッピング後に必要な追加コードを挿入するのが難しい場合があるためです。

http://lostechies.com/jimmybogard/2011/06/22/cleaning-up-posts-in-asp-net-mvc/

http://trycatchfail.com/blog/post/Cleaning-up-POSTs-in-ASPNET-MVC-the-Fail-Tracker-Way.aspx

投稿の場合、元のエンティティとフォーム データの 2 つが本当に必要です。GET 要求の場合と同じようにエンティティをロードし、通常のモデル バインディングを実行してフォーム データを取得し (ビューで吐き出すのとは異なるモデルをポスト バックに受け入れることができることを思い出してください)、アクションに変更を加えることができます。

もちろん、これにはアクションで AutoMapper を使用する必要がありますが、これは回避しようとしているようです。しかし、カスタム モデル バインダーを作成しない限り、組み込みのモデルがアクション パラメーターを見て何をバインドするかを判断するため、モデル内のフォームデータを魔法のように取得することはできません。このため、ドメイン モデルをアクションのパラメーターとして使用しないことをお勧めします。これは、希望しないフィールドに入力する可能性があるためです。

また、ジミーが ModelBinder を使用して AutoMapGet と同様のことを行っているのを見たことがありますが、これは別の代替方法である可能性がありますが、その投稿を見たことがあると思います。

私の標準的な投稿はマットのアプローチを採用し、検証をグローバル属性に移動して忘れられないようにし (これにはいくつかの欠点があります)、フォーム データの新しいビュー モデルを明示的に受け入れ、エンティティを明示的にロードし、使用します。 automapper を使用して更新し、save を呼び出します。ほとんどのアクションは、最終的に約 5 行の長さになります。

AutoMapper で静的メソッドを使用することは避け、コンストラクター インジェクションを介して IMapper を渡します。これにより、本当に必要な場合はもう少しテストしやすくなりますが、メソッドは通常非常に単純であるため、テストはそれほど価値を追加しません。

于 2012-10-06T01:07:22.657 に答える