13

ページに人物Aのリストと人物Bのリストがあるとします。そして、これら2つはL2Sの別個のクラスであり、2つの異なるテーブルを表します。したがって、次のように単一のモデルを渡すことはできません。

...
@model PeopleA
...
@foreach(var peopleA in Model.People) ...

@foreach(var peopleB in //what?)

したがって、私は従うべき3つのオプションがあると思います。

  • 1つ目は、ページを部分ビューに分割して、モデルをRenderActionヘルパーに渡すことができるようにすることです。これらの部分的なビューは一度だけ使用するので、このオプションは私には魅力的ではないようです。
  • 2番目のオプションは、強く型付けされたモデルを好むため、使用したくないViewBagsを使用することです。
  • 最後に、これから使用しようとしましたが、使用する前に質問したかったのは、次のようなモデルを作成することです。

ModelMyPage.cs

public List<PeopleA> peopleA { get; set; }
public List<PeopleB> peopleB { get; set; }

MyController.cs

... 
ModelMyPage m = new ModelMyPage();
m.peopleA = // query
m.peopleB = // another query
return(m);

そして、あなたはその考えを思いついた。これは私のタスクを達成するための有効な方法ですか、それとも私が望むことを行うためのより良いc#の方法がありますか?

4

5 に答える 5

18

オプション3が私が行う方法であるため、ページに固有のViewModelを作成します。

これも推奨されるアプローチだと思います。

于 2011-07-08T14:25:58.673 に答える
8

いいえ、これ以上のアイデアはありません。asp.net MVCでは、Mはビジネスドメインモデルではなく、ViewModelsを表します。ビューのViewModelを作成することをお勧めします。また、ビジネスモデルを使用することはお勧めしません。ドメインとのコントローラーの相互作用のニーズに合わせて、またコントローラーからビューの相互作用に合わせてViewModelを設計する必要があります

于 2011-07-08T14:31:38.667 に答える
3

最初と3番目のオプションはどちらも問題ないようです。

ad 1)「一度だけ使用する」というのは良い議論ではありません。部分ビューを使用してビューを整理します。

ad 2)Viewbagを使用して、ルックアップリストなどの小さなアイテムを追加します。

ad 3)ViewModelsはMVCで(なり)一般的になっています。これはおそらく最良のアプローチです。

于 2011-07-08T14:29:29.753 に答える
2

私はそれを第三の道でやります。さらに、両方の配列の各人に同一のhtmlをレンダリングする場合は、foreachの前にそれらを連結します。

var person in Model.PeopleA.Concat(Model.PeopleB)
于 2011-07-08T14:29:26.083 に答える
2

私は通常、ページのモデルを作成し、そのように名前を付けますAccountDetailsPageModel。次に、他のモデルが複雑なページのこれに適している可能性があります。

于 2011-07-08T14:33:59.307 に答える