0

ViewModelsへのどちらのアプローチが優れているか: 1。ViewModelにを入れて、ビューのプロパティにアクセスする
だけです。ICollection<T>これは、次のようにASP.NETフォームで行うこととほぼ同じです。

public ICollection<Order> Orders {get; set;}

ビューで私はこのようなことをするように

@if(Model.Orders.Count > 0){

または2.ICollection
のプロパティを作成してCount、ビューがその値を直接参照できるようにします。

public ICollection<Order> Orders { get; set; }
public int OrderCount { get { return Orders.Count ; } }

そしてビューで

@if(Model.OrderCount > 0) {

HasOrdersまたは、ビューのロジックをさらに減らすためのブールプロパティですか?

編集
コメントに少し驚いています。これは主観的なものだと思いますが、日付に文字列プロパティを使用するかどうかについての質問もあり、誰もがどこかで学習を開始する必要があります。

プロパティを何度も使用できOrderCountますか?次にif、実際のカウントを表示するラベル。そのため、お客様のメールアドレスを言うよりも頻繁に使用されますが、誰かがそれを提案した場合、私は驚かれることでしょう

public string Email { get; set; }

物事をやりすぎていました。

質問に少し焦点を合わせ直そうとするため。私が判断しようとしているのは、ViewModelがビューに必要なすべての単純なプロパティを提供する必要があるかどうかです。したがってModel.Orders、カウントにアクセスするためにに手を伸ばす必要はありません。ビューを純粋に保ち、ロジック/「プログラミング」から解放する必要があります

4

1 に答える 1

2

3.)ビューモデルでを使用しないでくださいCollection<T>。おそらくやり過ぎです。代わりに、T[]を使用してください。なんで?ビューモデルのプロパティに対して提供される、、、および.Addその他.Removeのオーバーヘッドメソッドは必要ないためです。結局、コントローラーからビューにデータを渡すためのDTOとして使用しているだけの場合、配列は完全に問題ありません。コントローラとの間の転送中に、列挙可能なものに追加したり、列挙可能なものから削除したりする必要はありません。配列は一般に、sや他の実装よりも高速で無駄がありません。ICollectionIEnumerableListIEnumerable

public Order[] Orders { get; set; }

次に、を使用せず.Count、を使用します.Length。別のプロパティを持つことは、通常、IMOもやり過ぎです。なんで?なぜなら、それはあなたが必要のない場所にもっと多くのコードを書くことになるということを意味しているからです。OrdersCount使用できるのになぜプロパティを追加するのOrders.Lengthですか?

@if (Model.Orders.Length > 0) {

もう少し短いものを探している場合は、.Any()LINQ拡張メソッドを使用できます(using System.Linq;ビューモデルクラスでこれを使用する場合は必要ですが、かみそりのビューで使用するために余分なものは必要ありません):

@if (Model.Orders.Any()) { // returns true if Model.Orders.Length > 0

このガイドラインの1つの考えられる例外は、が設定されていない場合Orders、つまり設定されていない場合ですnull。その場合、上記のかみそりコードは。をスローしNullReferenceExceptionます。このためHasOrdersに、ビューモデルにプロパティを作成して、nullとに対してテストすることができます.Length。ただし、より簡単な解決策は、コンストラクターでプロパティを初期化することです。

public class MyViewModel
{
    public MyViewModel()
    {
        Orders = new Order[0];
    }

    public Order[] Orders { get; set; }
}

確かに、上記の場合でも誰かが配列をnullに設定できるので、これを行うか、テストする別のプロパティを作成するか、かみそりのコードでnullテストするかを決定します。null

using System.Linq;

public class MyViewModel
{
    public Order[] Orders { get; set; }
    public bool HasOrders { get { return Orders != null && Orders.Any(); } }
}

...また...

@if (Model.Orders != null && Model.Orders.Any()) {

いずれにせよ、消費クラスまたは消費クラスのいずれかにもう少しコードが含まれることになります。これらの要素を使用して、どのアプローチがより少ないコードを書くことを意味するかを決定します。

a。)プロパティが可能nullですか?

b。)ビューモデルにはいくつのコレクションプロパティがありますか?

nullc。)どちらかに対して、または.Lengthかみそりのビューで何回テストする必要がありますか?

于 2013-03-22T22:45:00.647 に答える