ASP.NET MVCでは、ビューモデルにIDが必要ですか?


11

モデルを更新できるASP.NET MVCアプリケーションを開発する場合、更新されたビューモデルを取得し、現在更新されているモデルに戻す方法を知る方法が必要です。これを行うにはいくつかの異なる方法があるようで、これらのいずれかが適切なMVCではないのではないかと思っています(モデルにあるはずのデータをコントローラーに保存させるのは適切なMVCではありません)?

すべてのビューモデルにはIDがあります:長所

  • モデルと一致できることを常に確認してください。

短所

  • IDが変更されないように注意する必要があります。それ以外の場合は、ユーザーにアクセスを許可しない行を更新させることができます。

最低限のビューモデルのみにIDがあります:長所

  • ユーザーがアクセスしてはならないデータを更新しないようにするために必要なチェックがはるかに少なくなります。

短所

  • どのビューモデルがどのモデルと一致するかを追跡するのははるかに困難です。
  • ユーザーがアクセスできないデータを更新していないことを確認するには、IDを持ついくつかのビューモデルを確認する必要があります。

IDを持つビューモデルはありません:

長所

  • 更新のIDを確認する必要はありません。

短所

  • あなたは無国籍を放棄しなければなりません。

そこで、2つの質問があります。

まず、正しい/間違った選択肢がありますか?(そうでない場合、選択は意見の問題であり、私の2番目の質問は意見に基づいているため、無視する必要があります。)

第二に、正しい/間違った選択がある場合、それはどれですか?

コメントを明確にするために、データベースオブジェクトを模倣したビューモデルがある場合に話しています。

これを考えてください:

public class InvoiceViewModel  //Does not have ID, does not relate to model.
{
    public CustomerViewModel CustomerVM { get; set; }  //Maybe has ID?  Does relate to model.
    public AddressViewModel BillingAddressVM { get; set; } //Ditto
    public AddressViewModel ShippingAddressVM { get; set; } //Ditto
    public List<InvoiceLineItemViewModel> ItemVMs { get; set; }  //Each one has an ID?
}

これではない:

public class InvoiceViewModel
{
    public Customer Customer { get; set; }
    public Address BillingAddress { get; set; }
    public Address ShippingAddress { get; set; }
    public List<InvoiceLineItem> Items { get; set; }
}

2
ViewModel IDで正確に何をしますか?とにかく、ViewModelの個々のオブジェクトには独自のIDがありませんか?
ロバートハーヴェイ14年

ビューモデルがモデルに関連している場合にのみ指定する必要があります。すべてのビューモデルが関連しているわけではありません。
ロートンフォーグル14年

You have to abandon statelessness.-MVCを無意味に使用することを選択しました。
ジョエルイーサトン14年

ここで参照しているIDはデータベースの主キーですか、それともViewModelに追加している何かですか?
ヴァーミス

@Vermis、データベースの主キーは単純なIDになると思います。より完全なIDは、編集されたオブジェクトをまだ編集されていない永続化されたバージョンに関連付けて、編集された変更を永続化できる、変更不可能なデータです。
ロートンフォーグル14年

回答:


1

通常、ViewModelオブジェクトはデータベーステーブルに格納されるものではありません。 保存されるのは、ViewModelオブジェクト内の個々のアイテムです。 これらの各アイテムには既にIDがあります。

例えば:

public class InvoiceViewModel
{
    public Customer Customer { get; set; }
    public Address BillingAddress { get; set; }
    public Address ShippingAddress { get; set; }
    public List<InvoiceLineItem> Items { get; set; }
}

データベースにはInvoiceViewModelに対応する単一のテーブルがないため、InvoiceViewModelオブジェクトのIDはありません。

もちろん、この特定のViewModelのIDとしてInvoiceIDをいつでも使用できます。InvoiceIDは、このオブジェクトが最終的に表すものなので便利です。しかし、データベース内の特定のIDに対応しないViewModelオブジェクトがあることがわかりました。


1
ビューモデルの実際のモデルを使用する代わりに、InvoiceViewModelには他のビューモデル(モデルに関連する)の​​みが含まれていると考えてください。
ロートンフォーグル14年

-1

デフォルトでは、使用していない場合でもIDを表示する必要があります。asという名前のデータベースに列を作成し、ソートするように機能にidチェックマークを付けauto incrementます。


1
しかし、これは、とにかく idを持つ必要がある理由を説明せずに、他の答えと直接矛盾しています
マーティンピーターズ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.