web-dev-qa-db-ja.com

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

モデルの更新を可能にする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; }
}
11
Lawtonfogle

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
Robert Harvey