Dalam ASP.NET MVC, haruskah model tampilan memiliki ID?

11

Saat mengembangkan aplikasi ASP.NET MVC yang memungkinkan model diperbarui, Anda perlu beberapa cara untuk mengetahui cara mengambil model tampilan yang diperbarui dan mencocokkannya kembali dengan model yang sekarang diperbarui. Tampaknya ada beberapa cara berbeda untuk melakukan ini dan saya bertanya-tanya apakah ada di antara ini yang tidak sesuai dengan MVC (seperti halnya menyimpan data pengontrol Anda yang seharusnya ada dalam model bukan MVC yang tepat)?

Semua Model Tampilan memiliki ID: Pro

  • Selalu pastikan Anda dapat mencocokkan dengan model Anda.

Cons

  • Anda harus benar-benar berhati-hati karena tidak ada ID yang diubah selain Anda dapat meminta pengguna memperbarui baris yang seharusnya tidak dapat mereka akses.

Hanya model tampilan minimum telanjang yang memiliki ID: Pro

  • Pemeriksaan jauh diperlukan untuk menghindari pengguna memperbarui data yang seharusnya tidak mereka akses.

Cons

  • Jauh lebih sulit untuk melacak model tampilan apa yang cocok dengan model apa.
  • Anda masih harus memeriksa beberapa model tampilan dengan ID untuk memastikan pengguna tidak memperbarui data yang seharusnya tidak mereka akses.

Tidak ada model tampilan yang memiliki ID:

Pro

  • Tidak perlu memeriksa ID untuk pembaruan.

Cons

  • Anda harus meninggalkan kewarganegaraan.

Jadi saya punya dua pertanyaan.

Pertama, apakah ada pilihan yang benar / salah? (Jika tidak, itu artinya pilihan adalah masalah opini dan pertanyaan saya yang kedua berdasarkan dan harus diabaikan.)

Kedua, jika ada pilihan yang benar / salah, yang mana itu?

Untuk memperjelas komentar, saya berbicara ketika Anda memiliki model tampilan yang meniru objek database Anda.

Pikirkan ini:

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?
}

bukan ini:

public class InvoiceViewModel
{
    public Customer Customer { get; set; }
    public Address BillingAddress { get; set; }
    public Address ShippingAddress { get; set; }
    public List<InvoiceLineItem> Items { get; set; }
}
Lawtonfogle
sumber
2
Apa sebenarnya yang akan Anda lakukan dengan ID ViewModel? Bukankah objek individual di ViewModel memiliki ID mereka sendiri?
Robert Harvey
Saya mungkin harus menentukan hanya ketika model tampilan terkait dengan model. Tidak semua model tampilan terkait.
Lawtonfogle
You have to abandon statelessness.- Anda baru saja membuat pilihan untuk menggunakan MVC pointless.
Joel Etherton
Apakah ID yang Anda maksudkan di sini adalah kunci utama basis data, atau sesuatu yang Anda tambahkan ke ViewModel?
Vermis
@Vis, saya pikir kunci primer basis data akan menjadi ID sederhana. ID yang lebih menyeluruh adalah data yang tidak dapat dimodifikasi yang memungkinkan Anda untuk menghubungkan kembali objek yang diedit ke versi bertahan yang belum diedit sehingga perubahan yang diedit dapat dipertahankan.
Lawtonfogle

Jawaban:

1

Objek ViewModel bukan apa yang akan disimpan dalam tabel database, pada umumnya. Item individual di objek ViewModel yang disimpan. Masing-masing item sudah memiliki ID.

Sebagai contoh:

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

Karena tidak ada satu tabel dalam database yang terkait dengan InvoiceViewModel, tidak ada ID untuk objek InvoiceViewModel.

Tentu saja, Anda selalu dapat menggunakan InvoiceID sebagai id untuk ViewModel khusus ini. InvoiceID berguna, karena itulah yang pada akhirnya digambarkan oleh objek ini. Tapi saya bisa melihat memiliki objek ViewModel yang tidak sesuai dengan ID tertentu dalam database.

Robert Harvey
sumber
1
Pikirkan di mana daripada menggunakan model aktual dalam model tampilan, InvoiceViewModel hanya berisi model tampilan lain (yang terkait dengan model).
Lawtonfogle
-1

Secara default Anda harus memiliki id dalam tampilan meskipun Anda tidak menggunakannya. Buat kolom dalam database bernama iddan centang auto incrementfitur di atasnya sehingga Anda akan diurutkan.

akash
sumber
1
Hal ini secara langsung bertentangan dengan jawaban yang lain meskipun, tanpa mengatasi mengapa Anda harus memiliki id pula .
Martijn Pieters