Saya baru mengenal ASP.NET MVC. Saya memiliki masalah dengan memahami tujuan Model View.
Apa itu ViewModel dan mengapa kita membutuhkan ViewModel untuk Aplikasi ASP.NET MVC?
Jika saya mendapatkan contoh yang bagus tentang cara kerjanya dan penjelasannya, itu akan lebih baik.
asp.net-mvc
viewmodel
unik
sumber
sumber
Jawaban:
A
view model
mewakili data yang ingin Anda tampilkan pada tampilan / halaman Anda, apakah itu digunakan untuk teks statis atau untuk nilai input (seperti kotak teks dan daftar dropdown) yang dapat ditambahkan ke database (atau diedit). Itu adalah sesuatu yang berbeda dari Andadomain model
. Ini adalah model untuk tampilan.Katakanlah Anda memiliki
Employee
kelas yang mewakili model domain karyawan Anda dan berisi properti berikut (pengidentifikasi unik, nama depan, nama belakang, dan tanggal dibuat):Model tampilan berbeda dari model domain karena model tampilan hanya berisi data (diwakili oleh properti) yang ingin Anda gunakan pada tampilan Anda. Misalnya, katakanlah Anda ingin menambahkan catatan karyawan baru, model tampilan Anda mungkin terlihat seperti ini:
Seperti yang Anda lihat, hanya berisi dua properti. Kedua properti ini juga ada dalam model domain karyawan. Mengapa ini yang Anda tanyakan?
Id
mungkin tidak diatur dari tampilan, mungkin dibuat secara otomatis oleh tabel Karyawan. DanDateCreated
mungkin juga diatur dalam prosedur tersimpan atau di lapisan layanan aplikasi Anda. JadiId
danDateCreated
tidak diperlukan dalam model tampilan. Anda mungkin ingin menampilkan dua properti ini ketika Anda melihat detail karyawan (karyawan yang sudah ditangkap) sebagai teks statis.Saat memuat tampilan / halaman, metode buat tindakan di pengontrol karyawan Anda akan membuat instance dari model tampilan ini, mengisi setiap bidang jika diperlukan, dan kemudian meneruskan model tampilan ini ke tampilan / halaman:
Tampilan / halaman Anda mungkin terlihat seperti ini (dengan asumsi Anda menggunakan
ASP.NET MVC
danRazor
mesin tampilan):Validasi akan dilakukan hanya pada
FirstName
danLastName
. Menggunakan FluentValidation Anda mungkin memiliki validasi seperti ini:Dan dengan Anotasi Data, tampilannya mungkin seperti ini:
Hal utama yang perlu diingat adalah bahwa model tampilan hanya mewakili data yang ingin Anda gunakan , tidak ada yang lain. Anda dapat membayangkan semua kode dan validasi yang tidak perlu jika Anda memiliki model domain dengan 30 properti dan Anda hanya ingin memperbarui nilai tunggal. Dengan skenario ini, Anda hanya akan memiliki satu nilai / properti ini dalam model tampilan dan tidak semua properti yang ada di objek domain.
Model tampilan mungkin tidak hanya memiliki data dari satu tabel database. Itu dapat menggabungkan data dari tabel lain. Ambil contoh saya di atas tentang menambahkan catatan karyawan baru. Selain menambahkan hanya nama depan dan belakang Anda mungkin juga ingin menambahkan departemen karyawan. Daftar departemen ini akan datang dari
Departments
meja Anda . Jadi sekarang Anda memiliki data dariEmployees
danDepartments
tabel dalam satu model tampilan. Anda hanya perlu menambahkan dua properti berikut ke model tampilan Anda dan mengisinya dengan data:Saat mengedit data karyawan (karyawan yang telah ditambahkan ke database) itu tidak akan jauh berbeda dari contoh saya di atas. Buat model tampilan, sebut saja misalnya
EditEmployeeViewModel
. Hanya memiliki data yang ingin Anda edit dalam model tampilan ini, seperti nama depan dan nama belakang. Edit data dan klik tombol kirim. Saya tidak akan terlalu khawatir tentangId
bidang ini karenaId
nilainya mungkin ada di URL, misalnya:Ambil ini
Id
dan meneruskannya ke lapisan repositori Anda, bersama dengan nama depan dan nilai nama belakang Anda.Saat menghapus catatan, saya biasanya mengikuti jalur yang sama seperti dengan model tampilan edit. Saya juga akan memiliki URL, misalnya:
Ketika tampilan memuat untuk pertama kalinya saya akan mendapatkan data karyawan dari database menggunakan
Id
dari 3. Saya kemudian hanya akan menampilkan teks statis pada tampilan / halaman saya sehingga pengguna dapat melihat karyawan apa yang sedang dihapus. Ketika pengguna mengklik tombol Delete, saya hanya akan menggunakanId
nilai 3 dan meneruskannya ke lapisan repositori saya. Anda hanya perluId
menghapus catatan dari tabel.Poin lain, Anda tidak benar-benar membutuhkan model tampilan untuk setiap tindakan. Jika ini adalah data sederhana maka tidak apa-apa hanya digunakan
EmployeeViewModel
. Jika tampilan / halaman rumit dan berbeda satu sama lain maka saya sarankan Anda menggunakan model tampilan terpisah untuk masing-masing.Saya harap ini menghapus semua kebingungan yang Anda miliki tentang model tampilan dan model domain.
sumber
Lihat model adalah kelas yang mewakili model data yang digunakan dalam tampilan tertentu. Kita bisa menggunakan kelas ini sebagai model untuk halaman login:
Menggunakan model tampilan ini, Anda dapat menentukan tampilan (Razor view engine):
Dan tindakan:
Yang menghasilkan hasil ini (layar diambil setelah mengirimkan formulir, dengan pesan validasi):
Seperti yang Anda lihat, model tampilan memiliki banyak peran:
LabelFor
,EditorFor
,DisplayFor
pembantu).Contoh lain dari model tampilan dan pengambilannya: Kami ingin menampilkan data pengguna dasar, hak-hak istimewanya, dan nama pengguna. Kami membuat model tampilan khusus, yang hanya berisi bidang yang diperlukan. Kami mengambil data dari entitas yang berbeda dari basis data, tetapi tampilan hanya mengetahui kelas model tampilan:
Pengambilan:
sumber
Sunting: Saya memperbarui jawaban ini di Blog saya:
http://www.samwheat.com/post/The-function-of-ViewModels-in-MVC-web-development
Jawaban saya agak panjang tapi saya pikir penting untuk membandingkan model tampilan dengan tipe lain dari model yang umum digunakan untuk memahami mengapa mereka berbeda dan mengapa mereka diperlukan.
Untuk meringkas, dan untuk langsung menjawab pertanyaan yang ditanyakan:
Secara umum, model tampilan adalah objek yang berisi semua properti dan metode yang diperlukan untuk membuat tampilan. Lihat model properti sering terkait dengan objek data seperti pelanggan dan pesanan dan di samping itu mereka juga berisi properti yang terkait dengan halaman atau aplikasi itu sendiri seperti nama pengguna, nama aplikasi dll. Lihat model menyediakan objek yang nyaman untuk diteruskan ke mesin rendering untuk buat halaman html. Salah satu dari banyak alasan untuk menggunakan model tampilan adalah bahwa model tampilan menyediakan cara untuk menguji unit tugas presentasi tertentu seperti menangani input pengguna, memvalidasi data, mengambil data untuk ditampilkan, dll.
Berikut adalah perbandingan model Entity (model a.ka. DTO), Model Presentasi, dan Model Tampilan.
Objek Transfer Data alias “Model”
Objek Transfer Data (DTO) adalah kelas dengan properti yang cocok dengan skema tabel dalam database. DTO dinamai untuk penggunaan umum mereka untuk bolak-balik data ke dan dari penyimpanan data.
Karakteristik DTO:
• Apakah objek bisnis - definisi mereka bergantung pada data aplikasi.
• Biasanya hanya berisi properti - tanpa kode.
• Terutama digunakan untuk mengangkut data ke dan dari database.
• Properti persis atau sangat cocok dengan bidang pada tabel tertentu di penyimpanan data.
Tabel database biasanya dinormalisasi oleh karena itu DTO biasanya dinormalisasi juga. Ini membuat mereka terbatas digunakan untuk menyajikan data. Namun, untuk struktur data sederhana tertentu mereka sering melakukannya dengan cukup baik.
Berikut adalah dua contoh bagaimana DTO akan terlihat:
Model Presentasi
Model presentasi adalah kelas utilitas yang digunakan untuk menyajikan data di layar atau laporan. Model presentasi biasanya digunakan untuk memodelkan struktur data kompleks yang terdiri dari data dari beberapa DTO. Model presentasi sering mewakili tampilan data yang didenormalisasi.
Karakteristik Model Presentasi:
• Apakah objek bisnis - definisi mereka bergantung pada data aplikasi.
• Mengandung sebagian besar properti. Kode biasanya terbatas pada memformat data atau mengonversi ke atau dari DTO. Model Presentasi tidak boleh mengandung logika bisnis.
• Sering menyajikan tampilan data yang didenormalisasi. Artinya, mereka sering menggabungkan properti dari beberapa DTO.
• Sering berisi properti dengan tipe dasar berbeda dari DTO. Misalnya jumlah dolar dapat direpresentasikan sebagai string sehingga mereka dapat mengandung koma dan simbol mata uang.
• Sering didefinisikan oleh bagaimana mereka digunakan serta karakteristik objek mereka. Dengan kata lain, DTO sederhana yang digunakan sebagai model pendukung untuk membuat kisi sebenarnya juga merupakan model presentasi dalam konteks kisi itu.
Model presentasi digunakan "sesuai kebutuhan" dan "di mana diperlukan" (sedangkan DTO biasanya terkait dengan skema database). Model presentasi dapat digunakan untuk memodelkan data untuk seluruh halaman, kisi pada halaman, atau dropdown pada kisi pada halaman. Model presentasi sering berisi properti yang merupakan model presentasi lainnya. Model presentasi sering dibangun untuk tujuan penggunaan tunggal seperti untuk membuat grid tertentu pada satu halaman.
Contoh model presentasi:
Lihat Model
Model tampilan mirip dengan model presentasi di yang merupakan kelas dukungan untuk rendering tampilan. Namun sangat berbeda dari Model Presentasi atau DTO dalam hal bagaimana itu dibangun. Lihat model sering mengandung sifat yang sama seperti model presentasi dan DTO dan karena alasan ini mereka sering bingung satu sama lain.
Karakteristik Model Tampilan:
• Apakah satu-satunya sumber data yang digunakan untuk membuat halaman atau layar. Biasanya ini berarti bahwa model tampilan akan mengekspos setiap properti yang setiap kontrol pada halaman perlu render dengan benar. Menjadikan model tampilan sumber tunggal data untuk tampilan sangat meningkatkan kemampuan dan nilainya untuk pengujian unit.
• Apakah objek komposit yang berisi properti yang terdiri dari data aplikasi serta properti yang digunakan oleh kode aplikasi. Karakteristik ini sangat penting ketika merancang model tampilan untuk dapat digunakan kembali dan dibahas dalam contoh di bawah ini.
• Berisi kode aplikasi. Lihat Model biasanya berisi metode yang dipanggil saat rendering dan ketika pengguna berinteraksi dengan halaman. Kode ini biasanya terkait dengan penanganan acara, animasi, visibilitas kontrol, gaya, dll.
• Berisi kode yang memanggil layanan bisnis untuk tujuan mengambil data atau mengirimkannya ke server database. Kode ini sering keliru ditempatkan di sebuah pengontrol. Memanggil layanan bisnis dari pengontrol biasanya membatasi kegunaan model tampilan untuk pengujian unit. Agar jelas, lihat model itu sendiri tidak boleh mengandung logika bisnis tetapi harus membuat panggilan ke layanan yang memang mengandung logika bisnis.
• Sering berisi properti yang merupakan model tampilan lain untuk halaman atau layar lain.
• Ditulis "per halaman" atau "per layar". Model Tampilan yang unik biasanya ditulis untuk setiap halaman atau layar dalam suatu aplikasi.
• Biasanya berasal dari kelas dasar karena sebagian besar halaman dan layar berbagi properti umum.
Lihat Komposisi Model
Seperti yang dinyatakan sebelumnya, model tampilan adalah objek komposit yang menggabungkan properti aplikasi dan properti data bisnis pada objek tunggal. Contoh properti aplikasi yang umum digunakan yang digunakan pada model tampilan adalah:
• Properti yang digunakan untuk menampilkan status aplikasi seperti pesan kesalahan, nama pengguna, status, dll.
• Properti yang digunakan untuk memformat, menampilkan, menyesuaikan dgn mode, atau menghidupkan animasi.
• Properti yang digunakan untuk pengikatan data seperti objek daftar dan properti yang menyimpan data antara yang diinput oleh pengguna.
Contoh berikut menunjukkan mengapa sifat komposit dari model tampilan adalah penting dan bagaimana kita dapat membangun Model Tampilan yang paling efisien dan dapat digunakan kembali.
Asumsikan kita sedang menulis aplikasi web. Salah satu persyaratan desain aplikasi adalah bahwa judul halaman, nama pengguna, dan nama aplikasi harus ditampilkan pada setiap halaman. Jika kami ingin membuat halaman untuk menampilkan objek urutan presentasi, kami dapat memodifikasi model presentasi sebagai berikut:
Desain ini mungkin berfungsi ... tetapi bagaimana jika kita ingin membuat halaman yang akan menampilkan daftar pesanan? Properti PageTitle, UserName, dan ApplicationName akan diulang dan menjadi sulit untuk digunakan. Juga, bagaimana jika kita ingin mendefinisikan beberapa logika level-halaman dalam konstruktor kelas? Kami tidak dapat lagi melakukannya jika kami membuat instance untuk setiap pesanan yang akan ditampilkan.
Komposisi atas warisan
Berikut adalah cara kami mem-ulang faktor model presentasi urutan sehingga menjadi model tampilan sebenarnya dan akan berguna untuk menampilkan objek PresentationOrder tunggal atau koleksi objek PresentationOrder:
Melihat dua kelas di atas kita dapat melihat bahwa salah satu cara untuk berpikir tentang model tampilan adalah bahwa itu adalah model presentasi yang berisi model presentasi lain sebagai properti. Model presentasi tingkat atas (yaitu model tampilan) berisi properti yang relevan dengan halaman atau aplikasi sementara model presentasi (properti) berisi properti yang relevan dengan data aplikasi.
Kami dapat mengambil desain kami selangkah lebih maju dan membuat kelas model tampilan dasar yang dapat digunakan tidak hanya untuk PresentationOrders, tetapi untuk kelas lainnya juga:
Sekarang kita dapat menyederhanakan PresentationOrderVM kita seperti ini:
Kita dapat membuat BaseViewModel kita bahkan lebih dapat digunakan kembali dengan membuatnya generik:
Sekarang implementasi kami sangat mudah:
sumber
MyViewModel<MyPresModel>
Jika Anda memiliki properti khusus untuk tampilan, dan tidak terkait dengan toko DB / Layanan / Data, itu adalah praktik yang baik untuk menggunakan ViewModels. Katakanlah, Anda ingin meninggalkan kotak centang yang dipilih berdasarkan bidang DB (atau dua) tetapi bidang DB itu sendiri bukan boolean. Meskipun dimungkinkan untuk membuat properti ini dalam Model itu sendiri dan tetap menyembunyikannya dari pengikatan data, Anda mungkin tidak ingin mengacaukan Model tergantung pada jumlah bidang dan transaksi tersebut.
Jika ada terlalu sedikit data khusus tampilan dan / atau transformasi, Anda dapat menggunakan Model itu sendiri
sumber
Saya tidak membaca semua posting tetapi setiap jawaban sepertinya tidak ada satu konsep yang benar-benar membantu saya "mengerti" ...
Jika Model mirip dengan Tabel database , maka Model View serupa dengan tampilan database - Tampilan biasanya mengembalikan sejumlah kecil data dari satu tabel, atau, kumpulan data yang kompleks dari beberapa tabel (bergabung).
Saya menemukan diri saya menggunakan ViewModels untuk mengirimkan info ke tampilan / formulir, dan kemudian mentransfer data itu ke dalam Model yang valid ketika formulir posting kembali ke controller - juga sangat berguna untuk menyimpan Daftar (IEnumerable).
sumber
MVC tidak memiliki viewmodel: ia memiliki model, tampilan dan pengontrol. Model tampilan adalah bagian dari MVVM (Model-View-Viewmodel). MVVM berasal dari Model Presentasi dan dipopulerkan di WPF. Seharusnya juga ada model dalam MVVM, tetapi kebanyakan orang kehilangan titik dari pola itu sepenuhnya dan mereka hanya akan memiliki pandangan dan model tampilan. Model dalam MVC mirip dengan model dalam MVVM.
Dalam MVC proses ini dibagi menjadi 3 tanggung jawab yang berbeda:
MVC tidak terlalu cocok untuk aplikasi web. Ini adalah pola yang diperkenalkan oleh Smalltalk untuk membuat aplikasi desktop. Lingkungan web berperilaku sangat berbeda. Tidak masuk akal untuk menyalin konsep 40 tahun dari pengembangan desktop dan menempelkannya ke lingkungan web. Namun banyak orang berpikir ini ok, karena aplikasi mereka mengkompilasi dan mengembalikan nilai yang benar. Itu, menurut pendapat saya, tidak cukup untuk menyatakan pilihan desain tertentu sebagai ok.
Contoh model dalam aplikasi web dapat:
Pengontrol dapat menggunakannya seperti ini:
Metode pengontrol dan model Anda akan kecil, mudah diuji dan to the point.
sumber
Lihat model a adalah kelas sederhana yang dapat berisi lebih dari satu properti kelas. Kami menggunakannya untuk mewarisi semua properti yang diperlukan, misalnya saya punya dua kelas Siswa dan Subjek
Sekarang kami ingin menampilkan catatan Nama siswa dan Nama Subjek dalam Tampilan (Dalam MVC), tetapi tidak mungkin menambahkan lebih dari satu kelas seperti:
kode di atas akan menimbulkan kesalahan ...
Sekarang kita membuat satu kelas dan dapat memberikannya nama apa pun, tetapi format ini "XyzViewModel" akan membuatnya lebih mudah untuk dipahami. Itu adalah konsep warisan. Sekarang kita membuat kelas ketiga dengan nama berikut:
Sekarang kita menggunakan ViewModel ini dalam Tampilan
Sekarang kita dapat mengakses semua properti StudentViewModel dan kelas bawaan di View.
sumber
Banyak contoh besar, izinkan saya menjelaskan dengan cara yang jelas dan renyah.
ViewModel = Model yang dibuat untuk melayani tampilan.
Tampilan ASP.NET MVC tidak dapat memiliki lebih dari satu model sehingga jika kita perlu menampilkan properti dari lebih dari satu model ke tampilan, itu tidak mungkin. ViewModel melayani tujuan ini.
View Model adalah kelas model yang hanya bisa menampung properti-properti yang diperlukan untuk tampilan. Itu juga dapat berisi properti dari lebih dari satu entitas (tabel) dari database. Seperti namanya, model ini dibuat khusus untuk persyaratan Lihat.
Beberapa contoh Model Tampilan ada di bawah ini
ViewModel juga dapat digunakan untuk menyisipkan, memperbarui catatan ke lebih dari satu entitas namun penggunaan utama ViewModel adalah untuk menampilkan kolom dari banyak entitas (model) ke dalam satu tampilan.
Cara membuat ViewModel sama dengan membuat Model, cara membuat tampilan untuk Viewmodel sama dengan membuat tampilan untuk Model.
Berikut adalah contoh kecil dari data Daftar menggunakan ViewModel .
Semoga ini bermanfaat.
sumber
ViewModel adalah solusi yang menambal kecanggungan konseptual kerangka kerja MVC. Ini mewakili lapisan ke-4 dalam arsitektur Model-View-Controller 3-lapisan. ketika Model (model domain) tidak sesuai, terlalu besar (lebih besar dari 2-3 bidang) untuk Tampilan, kami membuat Model View yang lebih kecil untuk meneruskannya ke Tampilan.
sumber
Model tampilan adalah model data konseptual. Penggunaannya adalah misalnya mendapatkan subset atau menggabungkan data dari tabel yang berbeda.
Anda mungkin hanya menginginkan properti tertentu, jadi ini memungkinkan Anda untuk hanya memuatnya dan bukan properti yang tidak perlu tambahan
sumber
Merancang ViewModel
Menampilkan model tampilan dalam tampilan
Bekerja dengan Aksi
sumber
View Model adalah kelas yang bisa kita gunakan untuk merender data pada View. Misalkan Anda memiliki dua entitas Place dan PlaceCategory dan Anda ingin mengakses data dari kedua entitas menggunakan model tunggal maka kami menggunakan ViewModel.
Jadi pada Contoh Tempat dan Kategori di atas adalah dua entitas yang berbeda dan viewModel PlaceCategory adalah ViewModel yang dapat kita gunakan pada View.
sumber
Jika Anda ingin mempelajari kode cara mengatur aplikasi web "Baseline" dengan ViewModels, saya dapat menyarankan untuk mengunduh kode ini di GitHub: https://github.com/ajsaulsberry/BlipAjax . Saya mengembangkan aplikasi perusahaan besar. Ketika Anda melakukan ini bermasalah untuk mengatur arsitektur yang baik yang menangani semua fungsi "ViewModel" ini. Saya pikir dengan BlipAjax Anda akan memiliki "baseline" yang sangat bagus untuk memulai. Ini hanya situs web sederhana, tetapi bagus dalam kesederhanaannya. Saya suka cara mereka menggunakan bahasa Inggris untuk menunjukkan apa yang benar-benar dibutuhkan dalam aplikasi.
sumber