Model ASP.NET MVC vs ViewModel

92

Oke, saya telah mendengar diskusi tentang "ViewModels" sehubungan dengan MS ASP.NET MVC.

Sekarang, itu dimaksudkan untuk menjadi jenis Model tertentu, bukan? Bukan jenis Tampilan tertentu.

Menurut pemahaman saya, ini adalah jenis Model yang memiliki tujuan khusus untuk berinteraksi dengan View? Atau semacam itu?

Beberapa klarifikasi akan dihargai.

Qcom
sumber

Jawaban:

71

Pada dasarnya Model dan Model Tampilan adalah kelas sederhana dengan atribut.

Tujuan utama dari kelas-kelas ini adalah untuk mendeskripsikan (untuk "Model") sebuah objek untuk audiens masing-masing yang masing-masing adalah pengontrol dan tampilan.

Jadi, Anda benar saat mengatakannya

Menurut pemahaman saya, ini adalah sejenis Model yang memiliki tujuan khusus untuk berinteraksi dengan View

Jadi, sementara kelas Model secara efektif adalah Entitas Domain yang berinteraksi dengan aplikasi Anda, Model Tampilan adalah kelas sederhana tempat tampilan Anda berinteraksi.

Semoga membantu :)

Pembaruan :

Microsoft telah mengembangkan versi khusus dari Pola Presentasi oleh Martin fowler yang sebagian besar didasarkan pada Model-View-Controller dan menyebutnya Model-View-ViewModel (MVVM) untuk aplikasi PF. Pola ini ditargetkan pada platform pengembangan UI modern di mana pengembang UI memiliki persyaratan berbeda yang lebih didasarkan pada logika bisnis daripada pengembang tradisional. Lihat di sini untuk sedikit teori

Lorenzo
sumber
1
Oke, terima kasih, dan juga terima kasih atas pembaruannya, itu cukup membantu! Jadi, tanpa memperhitungkan versi khusus MS, dengan stok MVC 2, apakah Anda menempatkan ViewModels dalam folder khusus yang ditentukan? Atau apakah mereka pada dasarnya langsung dimasukkan ke folder Model seperti yang lainnya. Atau, bisakah Anda melakukan keduanya?
Qcom
Sama sama. Biasanya saya menempatkan model dan melihat model dalam folder yang sama karena saya ingin mengelompokkan mereka berdasarkan domain yang mereka rujuk, tetapi itu hanya pilihan saya dan saya yakin ada yang lebih baik
Lorenzo
5
ViewModel seharusnya memisahkan View dari (domain) Model. Jadi masuk akal untuk meletakkan ViewModel di dekat View, bukan di dekat Model.
Vitaliy Ulantikov
Saya akan menyimpan kelas 'Model' saya di luar proyek MVC saya daripada di folder Model - saya akan menyimpan kelas Model Tampilan di dalam proyek MVC, sehingga, seperti yang dikatakan Vitaliy mereka akan berada di dekat Tampilan.
Dan Harris
@Lorenzo Pada baris pertama Anda, Anda mengatakan "kedua kelas sederhana dengan atribut." Saya pikir yang Anda maksud dengan properti? Jika tidak, atribut apa yang Anda maksud? Atribut vs. Properti
xr280xr
69

Dalam istilah yang paling sederhana, saya suka memikirkan yang berikut:

Model: Secara ketat terlihat dan terasa seperti model data Anda. Untuk semua maksud dan tujuan, ini hanya representasi kelas dari model data Anda. Itu tidak memiliki pengetahuan tentang Tampilan Anda atau elemen apa pun dalam Tampilan Anda. Namun, itu tidak boleh berisi dekorator atribut apa pun (yaitu; Diperlukan, Panjang, dll.) Yang akan Anda gunakan untuk Tampilan Anda.

Model Tampilan: Berfungsi sebagai pengikat data antara Tampilan dan Model Anda dan dalam banyak kasus, juga merupakan pembungkus untuk Model Anda. Ini akan dianggap tidak berguna tanpa View, jadi biasanya tidak dapat digunakan kembali di beberapa View dan Controllers seperti Model standar.

Sebagai contoh, Model Anda mungkin memiliki properti berikut, yang merupakan representasi langsung dari sumber data Anda:

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

Sekarang, karena Model Tampilan Anda terkait dengan Tampilan Anda, mungkin memiliki properti berikut - yang menggabungkan bidang NamaDepan Model dan bidang NamaBelakang bersama sebagai satu string:

    [Display(Name = "Customer Name")]                
    public string CustomerFullName { get { return String.Format("{0} {1}", myModel.FirstName, myModel.LastName) }}
Jason Marsell
sumber
2
Bisakah Anda memberikan contoh ViewModel yang lebih lengkap? Bagaimana cara mengetahui apa itu myModel dan bagaimana cara mendapatkan data untuk myModel?
M Kenyon II
5
Secara alami, ViewModel adalah objek C # (POCO) biasa dan tidak akan pernah benar-benar tahu seperti apa model data Anda. Ini lebih merupakan campuran dari model data dan elemen spesifik yang perlu ditampilkan oleh tampilan Anda. Sejauh bagaimana ia mendapatkan data, Anda harus memuatnya dengan data tersebut. Saya suka menggunakan kelas perantara terpisah, di mana saya memanggil layanan saya untuk data dan kemudian secara manual memuat data itu ke ViewModel saya. Saya kemudian mengembalikan ViewModel yang terisi penuh ke aksi pengontrol.
Jason Marsell
26

Saya menemukan artikel ini sebagai sumber yang sangat berguna untuk memahami bagaimana "Model Domain" dan "Model Tampilan" berinteraksi dalam aplikasi MVC, terutama dalam hal pengikatan. Yang terbaik dari semuanya termasuk contoh, bukan deskripsi abstrak.

"Sejak MVC dirilis, saya telah mengamati banyak kebingungan tentang cara terbaik untuk membuat model tampilan. Terkadang kebingungan ini bukan tanpa alasan yang baik karena tampaknya tidak ada banyak informasi di luar sana tentang rekomendasi praktik terbaik. Selain itu, tidak ada solusi "satu ukuran cocok untuk semua" yang bertindak sebagai peluru perak. Dalam posting ini, saya akan menjelaskan beberapa pola utama yang muncul dan pro / kontra masing-masing. Penting untuk dicatat bahwa banyak dari pola ini telah muncul dari orang-orang yang memecahkan masalah dunia nyata. "

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

misteraidan
sumber
19

WikiPedia memiliki deskripsi Model vs. ModelView yang lebih lengkap daripada yang akan Anda dapatkan dalam jawaban SO: http://en.wikipedia.org/wiki/Model_View_ViewModel

Saya mengutip:

Model : seperti dalam pola MVC klasik, model mengacu pada (a) model objek yang mewakili konten keadaan nyata (pendekatan berorientasi objek), atau (b) lapisan akses data yang mewakili konten tersebut (data- pendekatan sentris).

Tampilan : seperti pada pola MVC klasik, tampilan mengacu pada semua elemen yang ditampilkan oleh GUI seperti tombol, jendela, grafik, dan kontrol lainnya.

ViewModel : ViewModel adalah "Model Tampilan" yang berarti merupakan abstraksi dari Tampilan yang juga berfungsi dalam pengikatan data antara Tampilan dan Model. Ini bisa dilihat sebagai aspek khusus dari apa yang akan menjadi Pengontrol (dalam pola MVC) yang bertindak sebagai pengikat / konverter data yang mengubah informasi Model menjadi informasi Tampilan dan meneruskan perintah dari Tampilan ke Model. ViewModel memperlihatkan properti publik, perintah, dan abstraksi. ViewModel telah diibaratkan sebagai status konseptual data sebagai lawan dari status sebenarnya dari data dalam Model.

Ian Mercer
sumber
3
Meskipun ada deskripsi Model dan ViewModel, tautan itu hanya menjelaskan pola arsitektur MVVM. Bukan perbedaan antara Model dan Tampilan Model
Lorenzo
5

Ada gagasan tentang ViewModel, tetapi umumnya tidak terkait dengan Asp.net MVC. MVC menggunakan pola Pengontrol Tampilan Model, tempat pengontrol menangani interaksi, menyusun data dari Model, lalu meneruskan data tersebut ke Tampilan untuk ditampilkan.

ViewModels (dan pola Model View ViewModel) lebih umum dikaitkan dengan Silverlight dan WPF. Xaml sedikit berbeda karena tampilan dapat melakukan pengikatan dua arah ke ViewModels, jadi teknologinya sedikit berbeda. Misalnya, jika Anda mengikat kotak teks ke bidang, saat Anda mengetik ke kotak teks itu, nilai bidang diperbarui secara dinamis. Interaksi semacam ini tidak mungkin dilakukan di halaman web karena halaman web tidak memiliki kewarganegaraan.

Kesamaan dalam dua pola tersebut adalah bahwa keduanya mencoba untuk memisahkan logika dari tampilan. Penggunaan / alasan paling umum untuk ini adalah pengujian: Anda ingin dapat melakukan dari kode (melalui kerangka pengujian) semua interaksi yang akan dipanggil oleh pengguna melalui Antarmuka Pengguna.

tsimon
sumber
Dalam buku yang saya baca, "Professional ASP MVC 2", ViewModel diperkenalkan di Bab 1 sebagai cara untuk menjaga agar presentasi / interaksi model tetap diketik dengan kuat dan KERING. Penulis microsoft termasuk Scott Hansleman, Phil Haack, Scott Guthrie.
Berryl
Saya telah melihat lebih banyak lagi, akhir-akhir ini, bahwa ViewModel sedang digunakan di Asp.net MVC. tampaknya ViewModel memiliki lebih banyak bisnis dalam tampilan daripada Model Domain. Jadi pola yang telah kita gunakan adalah membuat model domain mengumpulkan bagian utama ViewModel. Saat ini, kami menggunakan pola perintah yang dimodifikasi (operasi) yang bekerja dengan model domain untuk melakukan tugasnya. Hasilnya dikumpulkan ke dalam ViewModel dan dikirim ke tampilan. Viewmodel dalam hal ini menampung semua anotasi dan logika sederhana dan terfokus yang mendukung tampilan.
Sinaesthetic