2

多くの部分ビューを含むビューがあり、それぞれに一致するモデルを渡す必要があります。

これを行う2つの方法を見つけましたが、実際に行うべき方法はわかりません。

  1. すべてのモデルをプロパティとして含む大きなクラスを作成し、モデルを各部分ビューに送信できるようにすることを考えました。問題は、それが型付けされていないことです。モデルの異なる組み合わせを渡す必要がある場合、それは適合しません。

  2. 私が考えたもう 1 つの方法は、各モデルに、各部分ビュー (GetMenuBar() など) のモデルをもたらすメソッドを用意することです。

それを行う正しい方法は何ですか?

4

1 に答える 1

10

私のアドバイスは、オプション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);
}

これはすべてあなたがデザインを始めるのにちょうどあなたを始めるでしょう、あなたはあなたの心の内容にそれを微調整することができます:-)

于 2012-05-26T21:57:12.660 に答える