Misalkan saya memiliki ViewModel seperti
public class AnotherViewModel
{
public string Name { get; set; }
}
public class MyViewModel
{
public string Name { get; set; }
public AnotherViewModel Child { get; set; }
public AnotherViewModel Child2 { get; set; }
}
Dalam tampilan saya bisa membuat sebagian dengan
<% Html.RenderPartial("AnotherViewModelControl", Model.Child) %>
Secara parsial saya akan melakukannya
<%= Html.TextBox("Name", Model.Name) %>
or
<%= Html.TextBoxFor(x => x.Name) %>
Namun, masalahnya adalah keduanya akan membuat name = "Name" sementara saya harus memiliki name = "Child.Name" agar pengikat model berfungsi dengan benar. Atau, name = "Child2.Name" saat saya merender properti kedua menggunakan tampilan parsial yang sama.
Bagaimana cara membuat tampilan parsial saya secara otomatis mengenali awalan yang diperlukan? Saya bisa melewatkannya sebagai parameter tetapi ini terlalu merepotkan. Ini bahkan lebih buruk ketika saya ingin misalnya merendernya secara rekursif. Apakah ada cara untuk merender tampilan parsial dengan prefiks, atau, bahkan lebih baik, dengan pengubahan otomatis dari ekspresi lambda yang memanggil sehingga
<% Html.RenderPartial("AnotherViewModelControl", Model.Child) %>
secara otomatis akan menambahkan "Anak" yang benar. awalan ke string nama / id yang dihasilkan?
Saya dapat menerima solusi apa pun, termasuk mesin dan pustaka tampilan pihak ke-3 - Saya benar-benar menggunakan Mesin Tampilan Spark (saya "memecahkan" masalah menggunakan makro-nya) dan MvcContrib, tetapi tidak menemukan solusi di sana. XForms, InputBuilder, MVC v2 - alat / wawasan apa pun yang menyediakan fungsionalitas ini akan sangat bagus.
Saat ini saya berpikir tentang pengkodean ini sendiri tetapi sepertinya buang-buang waktu, saya tidak percaya hal-hal sepele ini belum diterapkan.
Mungkin ada banyak solusi manual, dan semuanya diterima. Misalnya, saya bisa memaksa parsial saya untuk didasarkan pada IP PartialViewModel <T> {public string Prefix; Model T; }. Tetapi saya lebih suka beberapa solusi yang ada / disetujui.
UPDATE: ada pertanyaan serupa tanpa jawaban di sini .
helper.ViewData.TemplateInfo.HtmlFieldPrefix
dalam bentuk{oldprefix}.{newprefix}
new ViewDataDictionary(helper.ViewData)
dengannew ViewDataDictionary(((HtmlHelper)helper).ViewData)
. Apakah Anda melihat ada masalah dengan itu?string oldPrefix = helper.ViewData.TemplateInfo.HtmlFieldPrefix; if (oldPrefix != "") name = oldPrefix + "." + name;
Sejauh ini, saya sedang mencari hal yang sama dengan yang saya temukan di posting terbaru ini:
http://davybrion.com/blog/2011/01/prefixing-input-elements-of-p Partial-views-with-asp-net-mvc/
sumber
ViewDataDictionary
konstruktor yang mengambil arusViewData
, atau Anda akan kehilangan kesalahan status model, data validasi, dll.Jawaban saya, berdasarkan jawaban Mahmoud Moravej termasuk komentar Ivan Zlatev.
Edit: Jawaban Mohamoud salah untuk rendering parsial bersarang. Anda perlu menambahkan prefiks baru ke prefiks lama, hanya jika perlu. Ini tidak jelas dalam jawaban terbaru (:
sumber
Menggunakan MVC2 Anda dapat mencapai ini.
Berikut adalah tampilan yang diketik dengan kuat:
Berikut adalah tampilan yang sangat diketik untuk kelas anak (yang harus disimpan dalam subfolder dari direktori tampilan yang disebut EditorTemplates):
Ini pengontrolnya:
Berikut adalah kelas khusus:
Dan sumber keluaran:
Sekarang ini sudah selesai. Tetapkan breakpoint dalam tindakan pengontrol Buat Posting untuk memverifikasi. Namun, jangan gunakan ini dengan daftar karena tidak akan berhasil. Lihat pertanyaan saya tentang menggunakan EditorTemplates dengan IEnumerable untuk lebih lanjut tentang itu.
sumber
Html.EditorFor
metode untuk merender bentuk anak. Untuk itulah template editor seharusnya digunakan. Ini harus menjadi jawabannya.Ini adalah pertanyaan lama, tetapi bagi siapa pun yang tiba di sini mencari solusi, pertimbangkan untuk menggunakan
EditorFor
, seperti yang disarankan dalam komentar di https://stackoverflow.com/a/29809907/456456 . Untuk berpindah dari tampilan parsial ke template editor, ikuti langkah-langkah berikut.Verifikasi bahwa tampilan parsial Anda terikat ke ComplexType .
Pindahkan tampilan parsial Anda ke subfolder EditorTemplates dari folder tampilan saat ini, atau ke folder Bersama . Sekarang, ini adalah template editor.
Ganti
@Html.Partial("_PartialViewName", Model.ComplexType)
ke@Html.EditorFor(m => m.ComplexType, "_EditorTemplateName")
. Template editor bersifat opsional jika itu satu-satunya template untuk tipe kompleks.Elemen Input HTML secara otomatis akan dinamai
ComplexType.Fieldname
.sumber
PartailFor untuk asp.net Core 2 jika seseorang membutuhkannya.
sumber
Saya menemukan masalah ini juga dan setelah banyak rasa sakit saya merasa lebih mudah untuk mendesain ulang antarmuka saya sehingga saya tidak perlu memposting kembali objek model bersarang. Ini memaksa saya untuk mengubah alur kerja antarmuka saya: tentu saya sekarang meminta pengguna untuk melakukan dalam dua langkah apa yang saya impikan untuk dilakukan di satu langkah, tetapi kegunaan dan pemeliharaan kode dari pendekatan baru ini lebih bernilai bagi saya sekarang.
Semoga ini bisa membantu beberapa.
sumber
Anda bisa menambahkan helper untuk RenderP Partial yang mengambil awalan dan memunculkannya di ViewData.
Kemudian helper lebih lanjut yang menggabungkan nilai ViewData
dan dalam tampilan ...
di parsial ...
sumber
Seperti Anda, saya menambahkan properti Prefix (string) ke ViewModels saya yang saya tambahkan sebelum nama input model terikat. (YAGNI mencegah hal di bawah)
Solusi yang lebih elegan mungkin model tampilan dasar yang memiliki properti ini dan beberapa HtmlHelpers yang memeriksa apakah model tampilan berasal dari basis ini dan jika demikian tambahkan awalan ke nama input.
Semoga membantu,
Dan
sumber
Bagaimana sebelum Anda memanggil RenderParsial yang Anda lakukan
Kemudian di bagian Anda, Anda punya
sumber