Dari pertanyaan ini , sepertinya masuk akal untuk memiliki controller membuat ViewModel yang lebih akurat mencerminkan model yang coba ditampilkan, tetapi saya ingin tahu tentang beberapa konvensi (saya baru dengan pola MVC , jika itu belum jelas).
Pada dasarnya, saya punya pertanyaan berikut:
- Saya biasanya suka memiliki satu kelas / file. Apakah ini masuk akal dengan ViewModel jika hanya dibuat untuk memberikan data dari pengontrol ke tampilan?
- Jika ViewModel memiliki file sendiri, dan Anda menggunakan struktur direktori / proyek untuk menjaga hal-hal terpisah, di mana file ViewModel berada? Di direktori Controllers ?
Itu pada dasarnya untuk saat ini. Saya mungkin memiliki beberapa pertanyaan lagi, tetapi ini telah mengganggu saya selama sekitar satu jam terakhir, dan saya dapat menemukan panduan yang konsisten di tempat lain.
EDIT: Melihat contoh aplikasi NerdDinner di CodePlex, sepertinya ViewModels adalah bagian dari Controllers , tetapi masih membuat saya tidak nyaman karena mereka tidak ada dalam file mereka sendiri.
asp.net-mvc
asp.net-mvc-viewmodel
jerhinesmith
sumber
sumber
Jawaban:
Saya membuat apa yang saya sebut "ViewModel" untuk setiap tampilan. Saya meletakkannya di folder bernama ViewModels di proyek Web MVC saya. Saya menamai mereka setelah controller dan action (atau view) yang mereka wakili. Jadi jika saya perlu meneruskan data ke tampilan Daftar pada pengontrol Keanggotaan saya membuat kelas MembershipSignUpViewModel.cs dan memasukkannya ke dalam folder ViewModels.
Kemudian saya menambahkan properti dan metode yang diperlukan untuk memfasilitasi transfer data dari controller ke tampilan. Saya menggunakan Automapper untuk mendapatkan dari Model View saya ke Model Domain dan kembali lagi jika perlu.
Ini juga berfungsi dengan baik untuk ViewModels komposit yang berisi properti yang dari jenis ViewModels lainnya. Misalnya jika Anda memiliki 5 widget pada halaman indeks di pengontrol keanggotaan, dan Anda membuat Model View untuk setiap tampilan parsial - bagaimana Anda meneruskan data dari tindakan Indeks ke parsial? Anda menambahkan properti ke MembershipIndexViewModel dari tipe MyPartialViewModel dan ketika merender sebagian Anda akan melewati Model.MyPartialViewModel.
Melakukannya dengan cara ini memungkinkan Anda untuk menyesuaikan sebagian properti ViewModel tanpa harus mengubah tampilan Indeks sama sekali. Itu masih baru saja lewat di Model.MyPartialViewModel sehingga ada sedikit kesempatan bahwa Anda harus melalui seluruh rantai parsial untuk memperbaiki sesuatu ketika semua yang Anda lakukan adalah menambahkan properti ke ViewModel parsial.
Saya juga akan menambahkan namespace "MyProject.Web.ViewModels" ke web.config sehingga memungkinkan saya untuk merujuk mereka dalam tampilan apa pun tanpa pernah menambahkan pernyataan impor eksplisit pada setiap tampilan. Hanya membuatnya sedikit lebih bersih.
sumber
Memisahkan kelas berdasarkan kategori (Controllers, ViewModels, Filter dll.) Adalah omong kosong.
Jika Anda ingin menulis kode untuk bagian Beranda situs web Anda (/) kemudian buat folder bernama Rumah, dan letakkan di sana HomeController, IndexViewModel, AboutViewModel, dll. Dan semua kelas terkait yang digunakan oleh tindakan Rumah.
Jika Anda telah berbagi kelas, seperti ApplicationController, Anda dapat meletakkannya di root proyek Anda.
Mengapa memisahkan hal-hal yang terkait (HomeController, IndexViewModel) dan menyatukan hal-hal yang tidak memiliki hubungan sama sekali (HomeController, AccountController)?
Saya menulis posting blog tentang topik ini.
sumber
Saya menyimpan kelas aplikasi saya dalam sub folder yang disebut "Core" (atau perpustakaan kelas terpisah) dan menggunakan metode yang sama dengan aplikasi sampel KIGG tetapi dengan sedikit perubahan untuk membuat aplikasi saya lebih KERING.
Saya membuat kelas BaseViewData di / Core / ViewData / di mana saya menyimpan properti umum situs lebar.
Setelah ini, saya juga membuat semua tampilan saya kelas ViewData di folder yang sama yang kemudian berasal dari BaseViewData dan memiliki properti tampilan tertentu.
Lalu saya membuat ApplicationController yang berasal dari semua pengontrol saya. ApplicationController memiliki Metode GetViewData generik sebagai berikut:
Akhirnya, dalam tindakan Pengontrol saya, saya melakukan hal berikut untuk membangun Model ViewData saya
Saya pikir ini bekerja dengan sangat baik dan itu membuat pandangan Anda rapi dan pengendali Anda kurus.
sumber
Kelas ViewModel hadir untuk merangkum beberapa bagian data yang diwakili oleh instance kelas menjadi satu objek yang mudah dikelola yang dapat Anda sampaikan ke View Anda.
Masuk akal untuk memiliki kelas ViewModel Anda di file mereka sendiri, di direktori sendiri. Dalam proyek saya, saya memiliki sub-folder dari folder Model yang disebut ViewModels. Di situlah ViewModels saya (mis.
ProductViewModel.cs
) Hidup.sumber
Tidak ada tempat yang baik untuk menyimpan model Anda. Anda dapat menyimpannya dalam perakitan terpisah jika proyeknya besar dan ada banyak ViewModels (Objek Transfer Data). Anda juga dapat menyimpannya di folder terpisah dari proyek situs. Sebagai contoh, di Oxite mereka ditempatkan di proyek Oxite yang berisi banyak kelas juga. Pengendali di Oxite dipindahkan ke proyek yang terpisah dan pandangan dalam proyek yang terpisah juga.
Dalam CodeCampServer, ViewModels diberi nama * Form dan ditempatkan di proyek UI di folder Models.
Di proyek MvcPress mereka ditempatkan di proyek Data, yang juga berisi semua kode untuk bekerja dengan database dan sedikit lebih banyak (tapi saya tidak merekomendasikan pendekatan ini, itu hanya untuk sampel)
Jadi Anda bisa melihat ada banyak sudut pandang. Saya biasanya menyimpan ViewModels (objek DTO) saya di proyek situs. Tetapi ketika saya memiliki lebih dari 10 model, saya lebih suka memindahkannya ke perakitan terpisah. Biasanya dalam kasus ini saya akan memindahkan pengontrol untuk memisahkan rakitan juga.
Pertanyaan lain adalah bagaimana cara memetakan semua data dengan mudah dari model ke ViewModel Anda. Saya sarankan untuk melihat di pustaka AutoMapper . Saya sangat menyukainya, itu semua kotor untuk saya.
Dan saya juga menyarankan untuk melihat proyek SharpArchitecture . Ini memberikan arsitektur yang sangat baik untuk proyek-proyek dan berisi banyak kerangka kerja keren dan bimbingan dan komunitas yang hebat.
sumber
inilah cuplikan kode dari praktik terbaik saya:
sumber
Kami membuang semua ViewModels kami di folder Models (semua logika bisnis kami ada di proyek ServiceLayer yang terpisah)
sumber
Secara pribadi saya akan menyarankan jika ViewModel adalah hal sepele kemudian gunakan kelas yang terpisah.
Jika Anda memiliki lebih dari satu model tampilan maka saya sarankan masuk akal untuk mempartisi setidaknya dalam direktori. jika model tampilan kemudian dibagikan maka ruang nama yang tersirat dalam direktori membuatnya lebih mudah untuk pindah ke majelis baru.
sumber
Dalam kasus kami, kami memiliki Model bersama dengan Pengendali dalam proyek yang terpisah dari Views.
Sebagai aturan praktis, kami telah mencoba untuk memindahkan dan menghindari sebagian besar ViewData ["..."] hal-hal ke ViewModel sehingga kami menghindari coran dan string sihir, yang merupakan hal yang baik.
ViewModel juga memiliki beberapa properti umum seperti informasi pagination untuk daftar atau informasi header halaman untuk menggambar remah roti dan judul. Pada saat ini, kelas dasar menyimpan terlalu banyak informasi menurut pendapat saya dan kami dapat membaginya dalam tiga bagian, informasi paling dasar dan penting untuk 99% halaman pada model tampilan dasar, dan kemudian model untuk daftar dan model untuk formulir yang menyimpan data spesifik untuk skenario itu dan mewarisi dari basis.
Akhirnya, kami menerapkan model tampilan untuk setiap entitas untuk berurusan dengan informasi spesifik.
sumber
kode di controller:
kode dalam model tampilan:
proyek:
DevJet.Web (proyek web ASP.NET MVC)
DevJet.Web.App.Dictionary (proyek Perpustakaan Kelas terpisah)
dalam proyek ini, saya membuat beberapa folder seperti: DAL, BLL, BO, VM (folder untuk model tampilan)
sumber
Buat kelas dasar model tampilan yang memiliki properti yang biasanya diperlukan seperti hasil operasi dan data kontekstual, Anda juga dapat menempatkan data pengguna saat ini dan peran
Di kelas pengendali dasar memiliki metode seperti PopulateViewModelBase () metode ini akan mengisi data kontekstual dan peran pengguna. HasError dan ErrorMessage, atur properti ini jika ada pengecualian saat menarik data dari layanan / db. Bind properti ini pada tampilan untuk menunjukkan kesalahan. Peran pengguna dapat digunakan untuk menampilkan bagian sembunyikan pada tampilan berdasarkan pada peran.
Untuk mengisi model tampilan dalam berbagai tindakan, dapat dibuat konsisten dengan memiliki basis controller dengan metode abstrak FillModel
Di pengontrol
sumber