-1

投稿時に別のViewModelに自動バインドしたいViewModelがあります。

例えば。私が持っている場合

public class ViewModelA{
    public string Stuff {get;set;}
}

public class ViewModelB{
    public string MyStuff {get;set;}
    .
    .
    .
}

表示/レンダリングの目的で、パーシャルを ViewModelA にバインドする必要があります。これは、インタラクティブなビューを作成することはコストのかかる提案であるため、はるかに単純なオブジェクトであり、再利用性が高くなることを願っています。

ただし、 postのページのすべてのフォーム情報が必要です。コントローラー アクションを拡張して ViewModelA と ViewModelB の両方を取得し、追加のロジックを実行して ViewModelA プロパティを ViewModelB に割り当てることができると思いますが、これを行うためのよりクリーンで宣言的な方法はありますか?

次のような属性を使用して、ViewModelA にタグを付けることができるかどうか疑問に思っていると思います。

 [Bind(Prefix = "ViewModelB", Include = "MyStuff")]

アクション レベルで実行できることはわかっていますが、このロジックを ViewModel レベルで挿入できますか?

また、Razor がより CQRS のアプローチに従っているとよいでしょう。例えば。

Html.TextBoxFor(target => target.Property, model => model.Property2)

そのため、レンダリング時にテキストボックスは Property2 値で初期化されますが、投稿時には target.Property に投稿されます。

4

3 に答える 3

0

ViewModelBで継承できませんViewModelAか?

public class ViewModelA : ViewModelB
{
     public string Stuff {get;set;}
     // etc.
}  

public class ViewModelB
{     
    public string MyStuff {get;set;}
    // etc.
} 

次に、Controller メソッドで、より広い範囲を指定するだけViewModelBで、モデル バインディングは引き続きすべてをマップする必要があります。

[HttpPost]
public ActionResult(ViewModelB model)
{
    // etc.
}
于 2012-04-27T17:21:05.473 に答える
0

両方のモデルがバインディングの目的で同じプロパティ名を持っていれば、継承によってこれを達成するか、実際のプロパティ名を設定することを目的とするヘルパー プロパティを使用することによって、より簡単になります。

これにより、ViewModelB が特定のプロパティ名を別の方法で処理できることを期待していることがより明確になり、ビュー テンプレートが煩雑にならなくなります。

于 2012-04-27T17:24:24.193 に答える
0

ViewModelBフォームの投稿を処理するアクションへのパラメーターとして指定するだけです。

例えば:

[HttpPost]
public ActionResult Create(ViewModelB newWidget) {
    // handle creation of widget... all information on the form pertaining to viewmodelB will be
    // available in newWidget
}

ビューの生成にどのモデルが使用されたかは問題ではありません。ViewModelB のプロパティ名と一致するフォーム フィールド名がある限り、Model Binder がそれを処理します。

于 2012-04-27T17:25:12.507 に答える