Mengikat koleksi di MVC

Saya memiliki Model Tampilan yang terdiri dari objek Applicant dan koleksi TeamMember. Ketika saya memposting kembali model tersebut, koleksi Tim selalu nol. Saya sudah mencoba mengubah koleksi dari IEnumarable asli saya menjadi List tetapi tidak ada bedanya. Jadi saya mengubah Tindakan Edit Pengontrol untuk menerima FormCollection, dan memverifikasi bahwa ada data di viewModel["member.FirstName"]. Saya bingung mengapa pengikatannya tidak berfungsi. Saya mencoba membersihkan contoh kode saya sebanyak mungkin tetapi saya bingung dengan apa yang saya lewatkan. Bantuan apa pun sangat dihargai!

Lihat Properti Model

public class MyViewModel
{
    public Applicant ApplicantInfo { get; set; }
    public List<TeamMember> TeamMembers { get; set; }
}

Pengontrol

[HttpPost]
public ActionResult Edit(MyViewModel viewModel)
{
         //  viewModel.ApplicantInfo has the form data
         //  viewModel.TeamMembers = null              
}

Lihat

<% using (Html.BeginForm())
       {%>
    <h3>
    <a href="/id#">Applicant Information</a>
    </h3>
    <label>
        City
        <%: Html.TextBoxFor(m => Model.ApplicantInfo.City)%>
    </label>
    <label>
        State
        <%: Html.TextBoxFor(m => Model.ApplicantInfo.State)%>
    </label>

    <h3>
    <a href="/id#">Team</a>
    </h3>
    <div>
    <% foreach (var member in Model.TeamMembers)
    { %>           
    <div class="editor-field">
        <%: Html.DropDownList("member.Type", Model.GetMemberTypes(member.MemberType.TypeId))%>
    </div>
    <div class="editor-field">
        <%: Html.EditorFor(m => member.FirstName)%>
    </div>
    <div class="editor-field">
        <%: Html.EditorFor(m => member.LastName)%>
    </div>
    <div class="editor-field">
        <%: Html.EditorFor(m => member.Title)%>
    </div>            
    <%} %>
    </div>
    <p>
        <input type="submit" value="Save" />
    </p>
    <% } %>

person MisterIsaak    schedule 09.02.2011    source sumber


Jawaban (2)


Saya percaya bahwa tag input yang terkait dengan item dalam koleksi (bila model itu sendiri bukan koleksi) harus memiliki indeks dalam atribut nama sebelum Anda dapat mengikat data yang diposting ke model tampilan. Inilah cara saya biasanya mencapai ini...

<% for (int i=0; i<Model.TeamMembers.Count; i++) { %>
<div class="editor-field">
  <%: Html.EditorFor(m => m.TeamMembers[i].FirstName)%>
</div>
<div class="editor-field">
  <%: Html.EditorFor(m => m.TeamMembers[i].LastName)%>
</div>
<% } %>

Saya juga menggunakan templat seperti yang disarankan oleh Shea, tetapi saya memiliki sedikit lebih banyak kode yang mencoba memaksanya untuk merender tanda kurung/indeks.

<% foreach (var member in Model.TeamMembers) { %>
  <%: Html.EditorFor(x => 
    member, 
    "TeamMember", 
    "TeamMembers["+(member.Number-1)+"]", 
    new { MemberTypes = Model.GetMemberTypes(member.MemberType.TypeId) })%>
<% } %>

Ini adalah artikel lama namun masih relevan dari Phil Haack tentang topik tersebut.

person Mayo    schedule 09.02.2011
comment
Saya cukup yakin bahwa ketika saya menerapkan templat saya, saya tidak perlu khawatir tentang memaksa indeks untuk ditampilkan, dll. Saya percaya ketika Anda menggunakan EditorFor pada daftar dan Anda memiliki templat editor untuk masing-masing item yang membentuk daftar , secara otomatis mengulangi dan menangani pengikatan, dll. - person Shea Daniels; 10.02.2011
comment
Saya tahu ini berfungsi tanpa mengindeks ketika model itu sendiri adalah sebuah daftar. Namun, saya mengalami masalah tanpa pengindeksan jika model memiliki daftar sebagai salah satu propertinya. Saya tentu saja menganjurkan agar pihak operasi mencobanya sebelum mengabaikannya. Terlihat jauh lebih bersih tanpa tanda kurung. - person Mayo; 10.02.2011
comment
Saya mencoba melakukannya dengan cara Shea terlebih dahulu tetapi sepertinya tidak berhasil. Sekarang setelah saya membaca postingannya lagi, saya rasa saya rindu memahaminya. Saya membuat templat yang menerima List<TeamMember> alih-alih TeamMember itu sendiri. Bagaimanapun saya menggunakan opsi indeks dan itu berfungsi dengan baik. Saya akan melihat apakah saya bisa membuatnya berfungsi dengan templat ketika waktu mengizinkan. Terima kasih kalian berdua! - person MisterIsaak; 10.02.2011
comment
Ya, saya mengalami batu sandungan yang sama. Templatnya bukan untuk daftar, melainkan untuk item daftar individual. MVC mengulangi daftar dan menggunakan templat editor sebanyak yang diperlukan. Ini secara otomatis menambahkan ID item daftar dengan nama koleksi pemiliknya dan posisi item dalam koleksi. - person Shea Daniels; 10.02.2011

Coba gunakan ini:

<%: Html.EditorFor(m => m.TeamMembers) %>

Kemudian buatlah template editor bersama dengan tipe model TeamMember. MVC harus menangani pengikatan semuanya kembali ke model tampilan Anda di postingan untuk Anda.

person Shea Daniels    schedule 09.02.2011