ASP.NET MVC'de, görünüm modellerinde bir kimlik olmalı mı?


11

Modelin güncellenmesine izin veren bir ASP.NET MVC uygulaması geliştirirken, güncellenmiş görünüm modelini nasıl alacağınızı ve şimdi güncellenen modelle nasıl eşleştireceğinizi bilmenin bir yolunu bulmanız gerekir. Bunu yapmanın birkaç farklı yolu var gibi görünüyor ve bunlardan herhangi birinin uygun MVC olup olmadığını merak ediyorum (modelinizde olması gereken denetleyicinizin depo verilerinin uygun MVC olmaması gibi)?

Tüm Görünüm Modellerinin bir kimliği vardır: Artıları

  • Daima modelinizle eşleşebildiğinizden emin olun.

Eksileri

  • Kimliklerin hiçbirinin değiştirilmemesine gerçekten dikkat etmelisiniz, aksi takdirde kullanıcıların erişmemeleri gereken satırları güncellemelerini sağlayabilirsiniz.

Yalnızca çıplak minimum görüntüleme modellerinin bir kimliği vardır: Artıları

  • Kullanıcıların erişmemesi gereken verileri güncellemelerini önlemek için çok daha az kontrol gerekli.

Eksileri

  • Hangi görünüm modellerinin hangi modelle eşleştiğini izlemek çok daha zor.
  • Kullanıcının erişimi olmaması gereken verileri güncellemediğinden emin olmak için kimliğe sahip birkaç görünüm modelini kontrol etmeniz gerekir.

Hiçbir görünüm modelinin kimliği yok:

Artıları

  • Güncellemeler için kimlikleri kontrol etmenize gerek yok.

Eksileri

  • Vatansızlığı terk etmek zorundasınız.

İki sorum var.

İlk olarak, doğru / yanlış bir seçim var mı? (Değilse, bu, seçimin bir görüş meselesi olduğu ve ikinci soru görüşüme dayalı olduğu ve göz ardı edilmesi gerektiği anlamına gelir.)

İkincisi, doğru / yanlış bir seçim varsa, hangisi?

Bir açıklamaya açıklık getirmek için, veritabanı nesnenizi taklit eden bir görünüm modeliniz olduğunda konuşuyorum.

Bunu düşün:

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

bu değil:

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 kimliğiyle tam olarak ne yapardınız? ViewModel'deki tek tek nesnelerin zaten kendi kimlikleri yok mu?
Robert Harvey

Muhtemelen sadece görünüm modeli bir modelle ilgili olduğunda belirtmeliyim. Tüm görünüm modelleri ilişkili değildir.
Lawtonfogle

You have to abandon statelessness.- MVC'yi anlamsız kullanmayı tercih ettiniz.
Joel Etherton

Burada bahsettiğiniz kimlik bir veritabanı birincil anahtarı mı yoksa ViewModel'e eklediğiniz başka bir şey mi?
Vermis

@Vermis, bir veritabanı birincil anahtarının basit bir kimlik olacağını düşünüyorum. Daha ayrıntılı bir kimlik, düzenlenmiş nesnelerinizi henüz düzenlenmemiş kalıcı sürümle ilişkilendirmenizi sağlayan değiştirilemez bir veri parçası olacaktır, böylece düzenlenen değişiklikler kalıcı olabilir.
Lawtonfogle

Yanıtlar:


1

ViewModel nesnesi genellikle bir veritabanı tablosunda depolanan şey değildir. ViewModel nesnesindeki depolanan öğelerdir. Bu öğelerin her birinin zaten bir kimliği var.

Örneğin:

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

Veritabanında InvoiceViewModel'e karşılık gelen tek bir tablo olmadığından, InvoiceViewModel nesnesinin kimliği yoktur.

Tabii ki, her zaman bu belirli ViewModel için kimlik olarak InvoiceID kullanabilirsiniz. InvoiceID kullanışlıdır, çünkü bu nesne nihayetinde bunu temsil eder. Ancak veritabanındaki belirli bir kimliğe karşılık gelmeyen bir ViewModel nesnesine sahip olduğunu görebiliyordum.


1
Görünüm modelinde gerçek modelleri kullanmak yerine InvoiceViewModel'in yalnızca diğer görünüm modellerini (modellerle ilgili) içerdiğini düşünün.
Lawtonfogle

-1

Varsayılan olarak, kullanmadığınız halde görünümde bir kimliğiniz olmalıdır. Veritabanında as adlı bir sütun oluşturun idve auto incrementsıralanmanız için özelliği işaretleyin .


1
Bu, yine de neden bir kimliğiniz olması gerektiğini ele almadan, diğer cevapla doğrudan çelişmektedir .
Martijn Pieters
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.