0

私のビューモデルは次のようになります。

public class CarViewModel {
    public CarModel Car { get; set; }
    public List<CarModel> Cars { get; set; }
}

CarModel次のようになります:

public class Car() {
    public string Make { get; set; }
    public string Model { get; set; }
    . . .
}

私の目標は、リストビューと単一ビューの両方に使用できる単一のビューモデルのみを用意することです。リストビューの場合、単一のCarエンティティを無視して、Carsリストをハイドレイトし、ビュー内で使用します。

詳細ビューの場合は、逆になります。私のコントローラーは単一のCarエンティティをハイドレイトし、ビューはそれを使用してリストを無視します。

これは部分的に機能していますが、モデルのバインドは弱いです。

ここでは、DRY(繰り返しないでください)とSOC / SRP(関心の分離/単一責任プリンシパル)が競合しているようです。リストビューと詳細ビューの両方を処理するための最良の方法は何ですか?答えは重複したビューモデルを作成することだと思いますが、私がそれを助けることができれば、コードを重複させたくありません。

4

2 に答える 2

2

あなたはこれを少し考えすぎているようです。CarViewModelというクラスが1つあるだけで、次のようになります。

public class CarViewModel() {
    public string Make { get; set; }
    public string Model { get; set; }
    . . .
}

詳細/編集/作成ビューの場合、ビューのタイプはCarViewModelです。リストビューの場合は、リストをビューに渡すだけCarViewModelです。リストビューでモデルタイプを作成しますIEnumerable<CarViewModel>()。これにより、現在提案されているパスからクラスが削除され、単一のビューモデルが車に関連するすべてのことを担当し続けます。

編集

懸念事項は、「私のリストビューモデルが単なる車のリストよりも多くの情報を必要とする場合はどうなるか」です。この場合、追加情報が必要になるため、リストビューのスタンドアロンビューモデルを作成することは理にかなっています。

public class ListOfCarsViewModel(){
   public IEnumerable<CarViewModel> Cars {get;set;}
   public string SomeOtherProperty {get;set;}
   public bool SomeFlagProperty {get;set;}
}

まだ車のリストをビューに渡しているので、繰り返していないことに注意してください。ただし、車のリスト以上のものが必要なため、このビューモデルには単なるリストよりも多くのプロパティが必要です。コード/ビューでその情報が必要な場合は、複数のビューモデルを使用しても問題はありません。

于 2012-10-28T16:47:34.443 に答える
0

また、メインモデルが次のように基本クラスを継承することもできます。

public class Car() { public string Make { get; set; } public string Model { get; set; } . . . } そしてあなたのモデルクラスのために

public class CarViewModel:Car { public List<CarModel> Cars { get; set; } }

于 2012-10-30T11:45:06.623 に答える