3

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番目のアプローチが気に入っています。この質問は、さらに議論するために開いたままにしておきます。

ここで何か不足している場合は、光を投げてください。

4

1 に答える 1

1

ViewModelビューのコンテキストで自然な単純なタイプのみを含むようにしています。そうすれば、ビュー内のロジックのレンダリングを最小限に抑え、ビューをきれいに保つことができます。

ViewModel は、次のようなもので非常に簡単に表すことができます。

public class ProjectEditViewModel
{
    public int YesNoTBDValueSelected { get; set; }
    public SelectList YesNoTBDValueOptions { get; set; }
}

また

public class ProjectEditViewModel
{
    public int YesNoTBDValueSelected { get; set; }
    public IEnumerable<SelectListItem> YesNoTBDValueOptions { get; set; }
}

生成するためのロジックがSelectList< Project->ProjectEditViewModelマッピングに入り、 から除外されViewます。

于 2013-06-30T10:57:09.540 に答える