私のアドバイスは、オプション1を使用することです。これは、すべてのメインビュー/複数の部分ビューのシナリオで使用します。各パーシャルには独自のViewModelがあるため、保守が簡単です。それは全体をきれいに保ちます
私は次のようにまったく同じセットアップを使用します:
public class MainViewModel {
public Partial1ViewModel Partial1 [ get; set; }
public Partial2ViewModel Partial2 [ get; set; }
public Partial3ViewModel Partial3 { get; set; }
public Partial4ViewModel Partial4 { get; set; }
public MainViewModel() {}
public MainViewModel() {
Partial1 = new Partial1ViewModel();
Partial2 = new Partial2ViewModel();
Partial3 = new Partial3ViewModel();
Partial4 = new Partial4ViewModel();
}
}
それぞれPartialViewXViewModel
が独自のViewModelであり、必要に応じて別のビューで再利用できます。
レンダリングするアクションは次のようになります。
public ActionResult Index {
var model = new MainViewModel();
return View(model);
}
あなたの見解
@model MainViewModel
<div>
{@Html.RenderPartial("PartialOne", Model.Partial1)}
</div>
<div>
{@Html.RenderPartial("PartialTwo", Model.Partial2)}
</div>
<div>
{@Html.RenderPartial("PartialThree", Model.Partial3)}
</div>
<div>
{@Html.RenderPartial("PartialFour", Model.Partial4)}
</div>
それぞれのUIを定義しますPartialX
。
@model Partial1ViewModel
//view html here
これで、各部分ビューhtmlとそれらが使用する各モデルをどこでも使用できるようになりました。
大きな部分は、これらのうち2つだけが必要なページがある場合、次のViewModel
ようにその特定のビューを表すために新しいものを作成することです。
public class OtherMainViewModel {
public Partial2ViewModel Partial2 [ get; set; }
public Partial4ViewModel Partial4 { get; set; }
public OtherMainViewModel() {}
public OtherMainViewModel() {
Partial2 = new Partial2ViewModel();
Partial4 = new Partial4ViewModel();
}
}
そして、次のような別のビューで使用します。
public ActionResult SomeOtherAction {
var model = new OtherMainViewModel();
return View(model);
}
そして、それは完全に受け入れられ、MVCで推奨される設計戦略でもあり、ビューに必要なものと必要なものだけを具体的に表すViewModelを使用できます。
モデルにデータを入力するために別の方法を使用することをお勧めします。ここでのほとんどは、Automapperの使用をお勧めします。いずれにせよ、上記はMainViewModelのコンストラクターでPartialViewXModelsを初期化するだけです。これらのモデルにDBからのデータを入力する場合は、必ずしもそうとは限りません。そのための独自の戦略が必要になります。これはここで機能します:
public ActionResult Index {
var model = new MainViewModel();
model.Partial1 = GetPartial1Data(); // this method would return Partial1ViewModel instance
model.Partial2 = GetPartial2Data(); // same as above for Partial2ViewModel
...
return View(model);
}
これはすべてあなたがデザインを始めるのにちょうどあなたを始めるでしょう、あなたはあなたの心の内容にそれを微調整することができます:-)