ASP.net MVC での ViewModel の使用に関するいくつかの投稿を読み、MV-VM パターンの「ViewModel」とは異なることに気付きました。
ViewModel は、モデルが View から直接アクセスされるのを避けるために使用されますが、ViewModel に (モデル レイヤーで定義された) タイプのプロパティを持つことは良い方法ですか? つまり、最終的にはModel 名前空間を ViewModel に含める必要があります。
例えば
モデル
1. YesNoTBDValue エンティティ/POCO クラス
public partial class YesNoTBDValue
{
public int Id { get; set; }
public string Name { get; set; }
}
2 Projectエンティティで使用される YesNoTBDValue クラス(モデル自体で定義)
public partial class Project
{
public virtual YesNoTBDValue IsAvailable { get; set; }
}
モデルの表示
1. ProjectEditViewModel
public class ProjectEditViewModel
{
HERE TO INCLUDE YesNoTBDValue CLASS, I NEED TO INCLUDE MODELS
OR THERE IS BETTER WAY?
public List<YesNoTBDValue> YesNoTBDValues { get; set; }
public int IsAvailableSelectedItemId { get; set; }
}
コントローラー
プロジェクト コントローラー (ビュー モデルの新しいインスタンスを作成する編集アクションで)
ProjectEditViewModel projectEditViewModel = new ProjectEditViewModel
{
YesNoTBDValues = db.YesNoTBDValues.ToList()
};
YesNoTBDValues リストから DropDownList を表示し、選択したアイテムを IsAvailableSelectedItemId に保持するビュー
@Html.DropDownList("IsAvailableSelectedItemId ",
new SelectList(Model.YesNoTBDValues, "Id", "Name",
Model.IsAvailableSelectedItemId ))
適切にコーディングする方法を教えてください。
繰り返しの質問: ViewModel にモデルの名前空間を含める必要がありますか? 私の例では、モデルでYesNoTBDValueが定義されており、それを使用するためにモデルの名前空間を使用しています
/別のアプローチ/
既存のアプローチに満足できず、Microsoft Nuget Gallery のソース コードを github からダウンロードしたところ、VIEWMODEL内で MODELS を使用したことがないことに気づきました。上記のコードを少し変更して(ViewModel から Model の参照を削除するため)、うまく機能していることがわかりました。
ここに私の変更があります:
機種 変更なし、そのまま
モデルの表示
1. YesNoTBDValue クラスのレプリカを作成します。YesNoTBDValueViewModel と言います。
public class YesNoTBDValueViewModel
{
public int Id { get; set; }
public string Name { get; set; }
}
2 ProjectEditViewModelでこの ViewModel を使用し、Model 参照を削除します
public class ProjectEditViewModel
{
public List<YesNoTBDValueViewModel> YesNoTBDValues {get;set;}
public int IsAvailableSelectedItem {get;set;}
}
コントローラーこれらの値を設定する方法を変更します。(編集アクションで)
ProjectEditViewModel projectEditViewModel = new ProjectEditViewModel
{
YesNoTBDValues = db.YesNoTBDValues.Select(
x => new LMSPriorTool.ViewModels.YesNoTBDValueVM
{
Id = x.Id,
Name = x.Name
}).ToList()
}
そして、これらの変更後に発見され、それもうまく機能しています。このモデルとビューモデルは互いに完全に分離されているため、この2番目のアプローチが気に入っています。この質問は、さらに議論するために開いたままにしておきます。
ここで何か不足している場合は、光を投げてください。