Jadi, judulnya harus berbicara sendiri.
Untuk membuat komponen yang dapat digunakan kembali dalam ASP.NET MVC, kami memiliki 3 opsi (bisa yang lain belum saya sebutkan):
Tampilan sebagian:
@Html.Partial(Model.Foo, "SomePartial")
Template Editor Kustom:
@Html.EditorFor(model => model.Foo)
Templat Tampilan Kustom:
@Html.DisplayFor(model => model.Foo)
Dalam hal Tampilan / HTML yang sebenarnya, ketiga implementasi itu identik:
@model WebApplications.Models.FooObject
<!-- Bunch of HTML -->
Jadi, pertanyaan saya adalah - kapan / bagaimana Anda memutuskan yang mana dari ketiganya yang akan digunakan?
Yang benar-benar saya cari adalah daftar pertanyaan untuk diri Anda sendiri sebelum membuat, yang jawabannya dapat digunakan untuk memutuskan templat mana yang akan digunakan.
Inilah 2 hal yang saya temukan lebih baik dengan EditorFor / DisplayFor:
Mereka menghormati hierarki model saat memberikan bantuan HTML (misalnya jika Anda memiliki objek "Bar" pada model "Foo" Anda, elemen HTML untuk "Bar" akan dirender dengan "Foo.Bar.ElementName", sementara sebagian akan memiliki " ElementName ").
Lebih kuat, misalnya jika Anda memiliki
List<T>
sesuatu dalam ViewModel Anda, Anda dapat menggunakan@Html.DisplayFor(model => model.CollectionOfFoo)
, dan MVC cukup pintar untuk melihatnya adalah koleksi dan merender tampilan tunggal untuk setiap item (sebagai lawan dari Partial, yang akan membutuhkan eksplisit untuk lingkaran).
Saya juga mendengar DisplayFor membuat templat "baca-saja", tetapi saya tidak mengerti itu - tidak bisakah saya melempar formulir di sana?
Bisakah seseorang memberi tahu saya beberapa alasan lain? Apakah ada daftar / artikel di suatu tempat membandingkan ketiganya?
Jawaban:
EditorFor
vsDisplayFor
sederhana. Semantik dari metode ini adalah untuk menghasilkan tampilan edit / sisipkan dan tampilkan / baca saja (masing-masing). GunakanDisplayFor
saat menampilkan data (yaitu ketika Anda menghasilkan div dan bentang yang berisi nilai model). GunakanEditorFor
saat mengedit / memasukkan data (yaitu ketika Anda menghasilkan tag input di dalam formulir).Metode di atas adalah model-sentris. Ini berarti bahwa mereka akan mempertimbangkan metadata model (misalnya Anda dapat membuat anotasi kelas model Anda dengan
[UIHintAttribute]
atau[DisplayAttribute]
dan ini akan memengaruhi templat mana yang dipilih untuk menghasilkan UI untuk model. Mereka juga biasanya digunakan untuk model data (yaitu model yang mewakili baris dalam database, dll)Di sisi lain
Partial
adalah view-centric di mana Anda sebagian besar peduli dengan memilih tampilan parsial yang benar. Tampilan tidak perlu model berfungsi dengan benar. Itu hanya dapat memiliki satu set markup yang digunakan kembali di seluruh situs. Tentu saja sering kali Anda ingin mempengaruhi perilaku parsial ini dalam hal ini Anda mungkin ingin lulus dalam model tampilan yang sesuai.Anda tidak bertanya tentang
@Html.Action
yang juga pantas disebutkan di sini. Anda bisa menganggapnya sebagai versi yang lebih kuatPartial
karena ia mengeksekusi action child controller dan kemudian me-render view (yang biasanya sebagian view). Ini penting karena tindakan anak dapat mengeksekusi logika bisnis tambahan yang tidak termasuk dalam sebagian pandangan. Misalnya itu bisa mewakili komponen kereta belanja. Alasan untuk menggunakannya adalah untuk menghindari melakukan pekerjaan yang berhubungan dengan keranjang belanja di setiap pengontrol di aplikasi Anda.Pada akhirnya pilihan tergantung pada apa yang Anda modelkan dalam aplikasi Anda. Ingat juga bahwa Anda dapat mencampur dan mencocokkan. Misalnya, Anda dapat memiliki tampilan sebagian yang memanggil
EditorFor
pembantu. Itu sangat tergantung pada apa aplikasi Anda dan bagaimana faktor itu untuk mendorong penggunaan kembali kode maksimum sambil menghindari pengulangan.sumber
Anda tentu bisa menyesuaikan
DisplayFor
untuk menampilkan formulir yang dapat diedit. Tetapi konvensi adalah untukDisplayFor
menjadireadonly
danEditorFor
untuk mengedit. Berpegang teguh pada konvensi akan memastikan bahwa apa pun yang Anda masukiDisplayFor
, ia akan melakukan hal yang sama.sumber
Hanya untuk memberikan nilai 2c saya, proyek kami menggunakan tampilan parsial dengan beberapa tab jQuery, dan setiap tab merender bidangnya dengan tampilan parsialnya sendiri. Ini berfungsi dengan baik sampai kami menambahkan fitur di mana beberapa tab berbagi beberapa bidang umum. Pendekatan pertama kami untuk ini adalah membuat tampilan parsial lain dengan bidang umum ini, tetapi ini menjadi sangat kikuk saat menggunakan EditorFor dan DropDownListFor untuk merender bidang dan drop down. Untuk mendapatkan id dan nama yang unik, kami harus merender bidang dengan awalan tergantung pada tampilan parsial induk yang membuatnya:
Ini menjadi sangat jelek sehingga kami memutuskan untuk menggunakan Editor Template sebagai gantinya, yang bekerja jauh lebih bersih. Kami menambahkan Model Tampilan baru dengan bidang umum, menambahkan Template Editor yang cocok, dan merender bidang tersebut menggunakan Template Editor dari berbagai tampilan induk. Template Editor dengan benar membuat id dan nama.
Singkatnya, alasan kuat bagi kami untuk menggunakan Editor Template adalah kebutuhan untuk merender beberapa bidang umum dalam banyak tab. Tampilan sebagian tidak dirancang untuk ini tetapi Editor Template menangani skenario dengan sempurna.
sumber
Gunakan
_partial
pendekatan tampilan jika:_partial
HTML terkait tampilan dalam tampilan ini saja. Dalam metode templat, Anda harus menyimpan beberapa HTML di luar Tampilan Templat seperti "Header Utama atau batas / pengaturan luar.URL.Action("action","controller")
.Alasan menggunakan Templat:
ForEach(Iterator)
. Templat cukup baik untuk mengidentifikasi Model sebagai tipe daftar. Ini akan melakukannya secara otomatis.sumber
Perbedaan lain yang belum disebutkan sejauh ini adalah bahwa partialview tidak menambahkan awalan model sementara template tidak di sini adalah masalahnya
sumber