ASP.NET MVC 3 - Sebagian Template Display vs Template Editor

303

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:

  1. 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 ").

  2. 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?

RPM1984
sumber
Konsep di balik editor dan templat tampilan jelas didefinisikan dalam dokumentasi untuk asp.net mvc 2. Templat adalah parsial yang mematuhi konvensi tertentu. Situasi yang menjadikan templat lebih baik atau lebih buruk daripada parsial lama hampir sepenuhnya bergantung pada apakah konvensi itu layak atau tidak patuh pada aplikasi Anda.
Nick Larsen

Jawaban:

301

EditorForvs DisplayForsederhana. Semantik dari metode ini adalah untuk menghasilkan tampilan edit / sisipkan dan tampilkan / baca saja (masing-masing). Gunakan DisplayForsaat menampilkan data (yaitu ketika Anda menghasilkan div dan bentang yang berisi nilai model). Gunakan EditorForsaat 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 Partialadalah 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.Actionyang juga pantas disebutkan di sini. Anda bisa menganggapnya sebagai versi yang lebih kuat Partialkarena 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 EditorForpembantu. Itu sangat tergantung pada apa aplikasi Anda dan bagaimana faktor itu untuk mendorong penggunaan kembali kode maksimum sambil menghindari pengulangan.

marcind
sumber
4
Itu jawaban yang bagus, persis apa yang saya cari. Pada kenyataannya saya menyukai fakta bahwa Anda akan datang dan menjawab ini. :) Terima kasih marcin.
RPM1984
Bagaimana Anda menggunakan anotasi untuk menentukan templat tampilan dan templat editor untuk satu properti?
stormwild
3
@stormwild menggunakan konvensi dan memberi nama templat Anda setelah model yang terkait (/Views/DisplayTemplates/MyModel.cshtml) atau memaksakannya secara eksplisit dengan anotasi UIHint.
Tom Wayson
Adakah saran untuk memilih untuk membuat panduan "daftar pengguna" yang dapat digunakan kembali? Saya ingin membuat pandangan ini (dan pengontrol) dalam perakitan terpisah jika memungkinkan. Aka, sebuah cara untuk mendistribusikan kembali di antara beberapa tim formulir / pengontrol yang dapat direspons ini. (kami telah menciptakan satu cara untuk menangani pengguna / penyimpanan (layanan webapi) ... tetapi masing-masing tim membuat halaman
PVC
Di mana Anda menyimpan template itu? Apakah saya perlu menyimpannya di Shared / EditorTemplates atau apakah mungkin untuk menyimpannya langsung di folder controller saat ini (ketika saya membutuhkannya hanya di sana)?
Santhos
15

Anda tentu bisa menyesuaikan DisplayForuntuk menampilkan formulir yang dapat diedit. Tetapi konvensi adalah untuk DisplayFormenjadi readonlydan EditorForuntuk mengedit. Berpegang teguh pada konvensi akan memastikan bahwa apa pun yang Anda masuki DisplayFor, ia akan melakukan hal yang sama.

Robert Levy
sumber
2
Saya tidak berpikir benar-benar ada pertanyaan / keraguan kapan seseorang harus menggunakan template tampilan vs template editor. Pertanyaan sebenarnya tampaknya kapan Anda harus menggunakan template vs sebagian. Jawaban Anda sepenuhnya melewatkan ini.
Joshua Hayes
19
@ Yosua - saya pikir ada beberapa pertanyaan untuk itu: "Saya juga mendengar DisplayFor merender template" read-only ", tetapi saya tidak mengerti itu - tidak bisakah saya melempar formulir di sana?"
Robert Levy
13

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:

    <div id="div-@(idPrefix)2" class="toHide-@(idPrefix)" style="display:none">
    <fieldset>
        <label for="@(idPrefix).Frequency">Frequency<span style="color: #660000;"> *</span></label>

        <input name="@(idPrefix).Frequency"
               id="@(idPrefix)_Frequency"
               style="width: 50%;"
               type="text"
               value="@(defaultTimePoint.Frequency)"
               data-bind="value: viewState.@(viewStatePrefix).RecurringTimepoints.Frequency"
               data-val="true"
               data-val-required="The Frequency field is required."
               data-val-number="The field Frequency must be a number."
               data-val-range-min="1"
               data-val-range-max="24"
               data-val-range="The field Frequency must be between 1 and 24."
               data-val-ignore="true"/>

        @Html.ValidationMessage(idPrefix + ".Frequency")

        ... etc

    </fieldset>
</div>

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.

Ciaran Bruen
sumber
1
Saya memiliki masalah serupa menggunakan tab dan akhirnya menggunakan BeginCollectionItem Steve Sanderson yang menghasilkan id kontrol unik untuk Anda: blog.stevensanderson.com/2010/01/28/…
Wilky
1

Gunakan _partialpendekatan tampilan jika:

  1. Lihat Logika Sentris
  2. Apa yang harus disimpan? _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.
  3. Ingin merender tampilan sebagian dengan logika (Dari pengontrol) menggunakan URL.Action("action","controller").

Alasan menggunakan Templat:

  1. Ingin menghapus ForEach(Iterator) . Templat cukup baik untuk mengidentifikasi Model sebagai tipe daftar. Ini akan melakukannya secara otomatis.
  2. Model Centric Logic. Jika beberapa tampilan ditemukan dalam tampilan yang sama untuk folder Templat, maka rendering akan bergantung pada Passed Model.
jitendra joshi
sumber
1

Perbedaan lain yang belum disebutkan sejauh ini adalah bahwa partialview tidak menambahkan awalan model sementara template tidak di sini adalah masalahnya

erhan355
sumber