ASP.NET MVC Modeli ile ViewModel Karşılaştırması


92

Tamam, MS'in ASP.NET MVC'si ile ilgili olarak "ViewModels" hakkında bir tartışma duyuyorum.

Şimdi, bunun belirli bir Model olması amaçlanıyor, değil mi? Belirli bir Görünüm türü değil.

Anladığım kadarıyla, bu Görünüm ile etkileşime girmek gibi belirli bir amacı olan bir tür Model mi? Ya da böyle bir şey?

Bazı açıklamalar takdir edilecektir.

Yanıtlar:


72

Esasen Model ve Görünüm Modeli, niteliklere sahip basit sınıflardır.

Bu sınıfların temel amacı, sırasıyla denetleyici ve görünüm olan ilgili izleyicileri için bir nesneyi tanımlamaktır ("Modellemek").

Yani söylediğinde tamamen haklısın

Anladığım kadarıyla, bu, Görünüm ile etkileşim kurmak gibi belirli bir amacı olan bir tür Model

Dolayısıyla, Model sınıfları, uygulamanızın etkileşimde bulunduğu etkili Etki Alanı Varlıkları iken, Görünüm Modelleri, görünümlerinizin etkileşimde bulunduğu basit sınıflardır.

Umarım yardımcı olur :)

Güncelleme :

Microsoft, Martin Fowler'ın Sunum Modelinin özel bir versiyonunu büyük ölçüde Model-Görünüm-Denetleyiciye dayalı olarak geliştirdi ve bunu PF uygulaması için Model-Görünüm-GörünümModel (MVVM) olarak adlandırdı. Bu model, UI geliştiricilerinin geleneksel geliştiricilerden daha fazla iş mantığına dayanan farklı gereksinimlere sahip olduğu modern UI geliştirme platformlarını hedeflemektedir. Biraz teori için buraya bir göz atın


1
Tamam, teşekkürler ve güncelleme için de teşekkürler, bu oldukça faydalı! Öyleyse, MS'nin özel versiyonunu hesaba katmadan, MVC 2 stoklu ViewModel'leri özel, belirlenmiş bir klasöre yerleştiriyor musunuz? Ya da aslında diğerleri gibi doğrudan Modeller klasörüne mi yerleştirilmişler? Ya da yapabilir misin?
Qcom

Rica ederim. Genellikle modelleri aynı klasöre yerleştiririm ve modelleri görüntülerim çünkü onları referans verdikleri alan adına göre gruplandırmak istiyorum ama bu sadece benim seçimim ve eminim ki daha iyisi var
Lorenzo

5
ViewModel, View'u (etki alanı) Modelinden ayırmalıdır. Bu nedenle, ViewModel'i Model'in yakınına değil Görünümün yakınına koymak mantıklıdır.
Vitaliy Ulantikov

'Model' sınıflarımı bir Model klasörü yerine MVC projemin dışında tutardım - Bununla birlikte, Görünüm Modeli sınıflarını MVC projesinin içinde tutardım, böylece Vitaliy'nin dediği gibi, Görünüme yakın olacaklar.
Dan Harris

@Lorenzo İlk satırınızda "özniteliklere sahip her iki basit sınıf" diyorsunuz. Mülklerle mi demek istiyorsun? Değilse, hangi özelliklere atıfta bulunuyordunuz? Nitelikler ve Özellikler
xr280xr

69

En basit ifadeyle, aşağıdakileri düşünmeyi seviyorum:

Model: Kesinlikle veri modeliniz gibi görünür ve hissedilir. Tüm amaç ve amaçlar için, veri modelinizin yalnızca bir sınıf temsilidir. Görüşünüz veya Görünümünüzdeki herhangi bir öğe hakkında hiçbir bilgisi yoktur. Bununla birlikte, Görünümünüz için kullanacağınız herhangi bir öznitelik dekoratörünü (yani; Gerekli, Uzunluk, vb.) İçermemelidir.

Modeli Görüntüle: Görünümünüz ve Modeliniz arasında bir veri bağlayıcı görevi görür ve çoğu durumda Modeliniz için bir sarmalayıcıdır. Görünüm olmadan işe yaramaz hale gelirdi, bu nedenle genellikle standart bir Model gibi birden fazla Görünüm ve Denetleyici arasında yeniden kullanılamaz.

Örnek olarak, Modeliniz, veri kaynağınızın doğrudan temsilleri olan aşağıdaki özelliklere sahip olabilir:

    public string FirstName { get; set; }
    public string LastName { get; set; }

Şimdi, Görünüm Modeliniz Görünümünüze bağlı olduğundan, Modelin FirstName alanını ve LastName alanını tek bir dize olarak birleştiren şu özelliğe sahip olabilir:

    [Display(Name = "Customer Name")]                
    public string CustomerFullName { get { return String.Format("{0} {1}", myModel.FirstName, myModel.LastName) }}

2
ViewModel'in daha kapsamlı bir örneğini verebilir misiniz? MyModel'in ne olduğunu nasıl biliyor ve myModel için verileri nasıl alıyor?
M Kenyon II

5
Doğası gereği, bir ViewModel eski bir C # nesnesidir (POCO) ve veri modelinizin neye benzediğini asla tam olarak bilemez. Veri modelinizin ve görünümünüzün göstermesi gereken belirli öğelerin daha çok bir karmasıdır. Verileri nasıl aldığına gelince, onu verilerle birlikte yüklemeniz gerekir. Veri için servisimi aradığım ve ardından bu verileri ViewModel'ime manuel olarak yüklediğim ayrı bir aracı sınıf kullanmayı seviyorum. Daha sonra tam yüklü ViewModel'i kontrolör eylemine geri döndürüyorum.
Jason Marsell

26

Bu makaleyi, "Etki Alanı Modeli" ve "Görünüm Modeli" nin bir MVC uygulamasında, özellikle bağlama açısından nasıl etkileşime girdiğini anlamak için çok yararlı bir kaynak buldum. Hepsinden iyisi, soyut açıklamalar yerine örnekler içerir.

"MVC piyasaya sürüldüğünden beri, en iyi görünüm modellerinin nasıl oluşturulacağına dair çok fazla kafa karışıklığı gözlemledim. Bazen bu kafa karışıklığının iyi bir sebebi yok, çünkü en iyi uygulama önerileri hakkında pek çok bilgi yok gibi görünüyor. Ek olarak, yok Gümüş mermi görevi gören "herkese uyan tek boyut" çözümü. Bu yazıda, ortaya çıkan ana kalıplardan birkaçını ve her birinin artılarını / eksilerini anlatacağım. Bu kalıpların çoğunun gerçek dünya sorunlarını çözen insanlardan ortaya çıktı. "

http://geekswithblogs.net/michelotti/archive/2009/10/25/asp.net-mvc-view-model-patterns.aspx


19

WikiPedia, Model ve ModelView için bir SO cevabından daha eksiksiz bir açıklamaya sahiptir: http://en.wikipedia.org/wiki/Model_View_ViewModel

Alıntı yaparım:

Model : Klasik MVC modelinde olduğu gibi, model ya (a) gerçek durum içeriğini temsil eden bir nesne modeline (nesne yönelimli bir yaklaşım) ya da (b) bu ​​içeriği temsil eden veri erişim katmanına (bir veri- merkezli yaklaşım).

Görünüm : klasik MVC modelinde olduğu gibi, görünüm, düğmeler, pencereler, grafikler ve diğer kontroller gibi GUI tarafından görüntülenen tüm öğeleri ifade eder.

ViewModel : ViewModel bir "Görünüm Modeli" dir, yani Görünüm ile Model arasında veri bağlamada da hizmet eden Görünümün bir soyutlamasıdır. Model bilgisini Görünüm bilgisine dönüştüren ve Görünümden Modele komutları ileten bir veri bağlayıcı / dönüştürücü görevi gören bir Denetleyicinin (MVC modelinde) özel bir yönü olarak görülebilir. ViewModel genel özellikleri, komutları ve soyutlamaları ortaya çıkarır. ViewModel, Modeldeki verilerin gerçek durumunun aksine verilerin kavramsal durumuna benzetilmiştir.


3
Model ve ViewModel'in bir açıklaması olsa da, bu bağlantı sadece MVVM mimari modelini açıklıyor. Model ve Modelleri Görüntüle arasındaki farklar değil
Lorenzo

5

Bir ViewModel kavramı vardır, ancak genel olarak Asp.net MVC ile ilişkilendirilmez. MVC, denetleyicinin etkileşimleri işlediği, Modelden veri oluşturduğu ve ardından bu verileri görüntülemek için Görünüm'e ilettiği Model Görünüm Denetleyici kalıbını kullanır.

ViewModels (ve Model View ViewModel kalıbı) daha genel olarak Silverlight ve WPF ile ilişkilidir. Xaml, görünümlerin ViewModel'lere iki yönlü bağlanabilmesi açısından biraz farklıdır, bu nedenle teknoloji biraz farklıdır. Örneğin, bir metin kutusunu bir alana bağlarsanız, o metin kutusuna yazarken, alanın değeri dinamik olarak güncellenir. Web sayfaları devletsiz olduğu için web sayfalarında bu tür bir etkileşim gerçekten mümkün değildir.

İki modeldeki benzerlik, her ikisinin de mantığı ekrandan ayırmaya çalışmasıdır. Bunun en yaygın kullanımı / nedeni test etmektir: bir kullanıcının Kullanıcı Arayüzü aracılığıyla başlatacağı tüm etkileşimleri koddan (bir test çerçevesi aracılığıyla) gerçekleştirebilmek istiyorsunuz.


Okuduğum kitapta, "Professional ASP MVC 2", ViewModel, 1. Bölümde hem güçlü tipte hem de DRY sunum / model etkileşimlerini tutmanın bir yolu olarak tanıtıldı. Microsoft yazarları arasında Scott Hansleman, Phil Haack, Scott Guthrie bulunmaktadır.
Berryl

ViewModel'in Asp.net MVC'de kullanıldığını son zamanlarda çok daha fazla gördüm. Görünüşe göre ViewModel, Etki Alanı Modelinden daha fazla iş alanına sahip. Dolayısıyla, kullandığımız model, etki alanı modellerinin ViewModel'in ana parçalarını bir araya getirmesi. Şu anda, görevlerini gerçekleştirmek için etki alanı modelleriyle çalışan değiştirilmiş bir komut kalıbı (işlemler) kullanıyoruz. Sonuçlar ViewModel'de birleştirilir ve görünüme gönderilir. Bu durumda görünüm modeli, tüm ek açıklamaları ve görünümü destekleyen basit, odaklanmış mantığı tutar.
Sinaesthetic
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.