[ad_1]
私はこの問題について同僚と議論していました。 ビュー内の他のモデルからのデータは必要ないため、モデルを直接操作しても問題なく動作する場合でも、モデルのビューモデルを作成することは絶対に必要ですか?
私が試したこと:
この場合、モデルにはロジックがなく、poco です。 ロジックは、それぞれのリポジトリから取得されます。
解決策 1
あなたはそうしない もつ それらを使用することはできませんが、生活をよりシンプルにすることができます。
たとえば、ビューでエンティティを編集するイメージ。 そのエンティティには、ドロップダウン リストとして表示する他のエンティティへの関係が含まれています。 オプションのリストをエンティティ クラスに追加したくないので、次の 2 つのオプションがあります。
- オプションリストを
ViewBag
. コントローラーで使用するキーがビューで使用するキーと一致することをコンパイル時に検証することはできません。 また、おそらくビューにキャストを挿入する必要があります。ViewBag
プロパティを返すdynamic
、および HTML ヘルパー メソッドは使用できませんdynamic
値。 - ビューモデルを使用し、その中にリストを保存します。 ビューで醜いキャストは必要ありません。コンパイラは、ビューで使用するプロパティがビューモデルのプロパティと一致することを確認します。 (ただし、正しいプロパティを使用したことを保証するものではありません!)
@Html.DropDownListFor(m => m.SomeProperty, (IEnumerable<SelectListItem>)ViewBag.SomePropertyOptions, "(None)")
対:
@Html.DropDownListFor(m => m.SomeProperty, Model.SomePropertyOptions, "(None)")
解決策 2
必要はありません。実用的です。
モデル内のデータがビューに表示したいデータと 1:1 である場合、モデルを使用しても問題ありません。
一方、データの一部のみを表示したり、そのビューモデルをカスタマイズしたりしたい場合は、IMO より良いアプローチです。
モデルの一部ではない (またはすべきではない) 追加機能を追加する場合も同様です。
線はぼやけていることが多く、ニーズに合ったものを使用しますが、一貫したアプローチを心がけてください。
それらは私の5セントです。
解決策 3
「EditModel」と名付けた別のアプローチを選択しました。 これはバインディングでもビュー モデルでもありません。表示するかバインドするかによって、両方の何かになります。
アイデア:
EditModel にはモデルがアタッチされていますが、ドロップダウンで使用できる辞書などの追加データも提供します。
これを想像してください:
public class Teacher { public int Id { get; set; } public int SchoolId { get; set; } public School School { get; set; } = new(); public string Name { get; set; } = ""; } public class TeacherEditModel { public Teacher Item { get; set; } public Dictionary<int, string> Schools { get; set; } }
ビューでは編集モデルを使用しますが、そのアイテムのみをバインドします。
そして、次のようなアイテムにバインドします
TryUpdateModel<Teacher>(model, "Item")
コントローラーでは、PopulateDropDowns などのメソッドで辞書を入力します。
利点は、ViewBag を使用せず、コードを複製しないことです。
あなたがアイデアを得たことを願っています。
[ad_2]
コメント