การรวมคอลเลกชันใน MVC

ฉันมี View Model ที่ประกอบด้วยวัตถุ Applicant และคอลเลกชัน TeamMember เมื่อฉันโพสต์โมเดลกลับ คอลเลกชันทีมจะเป็นโมฆะเสมอ ฉันได้ลองเปลี่ยนคอลเลกชันจาก IEnumarable ดั้งเดิมของฉันเป็น List แต่นั่นก็ไม่ได้สร้างความแตกต่าง ดังนั้นฉันจึงเปลี่ยนการดำเนินการแก้ไขตัวควบคุมเพื่อยอมรับ FormCollection และตรวจสอบว่ามีข้อมูลใน viewModel["member.FirstName"] ฉันสับสนว่าทำไมการผูกข้อมูลไม่ทำงาน ฉันพยายามล้างตัวอย่างโค้ดให้มากที่สุดเท่าที่จะเป็นไปได้ แต่ฉันสับสนกับสิ่งที่ฉันขาดหายไป ความช่วยเหลือใด ๆ ที่ชื่นชมอย่างมาก!

ดูคุณสมบัติของโมเดล

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

ตัวควบคุม

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

ดู

<% using (Html.BeginForm())
       {%>
    <h3>
    <a href="/th#">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="/th#">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 แหล่งที่มา


คำตอบ (2)


ฉันเชื่อว่าแท็กอินพุตที่เกี่ยวข้องกับรายการในคอลเลกชัน (เมื่อโมเดลนั้นไม่ใช่คอลเลกชัน) จำเป็นต้องมีดัชนีในแอตทริบิวต์ name ก่อนที่คุณจะสามารถผูกข้อมูลที่โพสต์เข้ากับโมเดลมุมมองได้ นี่คือวิธีที่ฉันมักจะทำสิ่งนี้ให้สำเร็จ...

<% 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>
<% } %>

ฉันยังใช้เทมเพลตตามที่ Shea แนะนำ แต่ฉันมีโค้ดเพิ่มเติมเล็กน้อยที่พยายามบังคับให้แสดงวงเล็บปีกกา/ดัชนี

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

นี่คือบทความเก่าแต่ยังคงมีความเกี่ยวข้อง จาก Phil Haack ในหัวข้อ

person Mayo    schedule 09.02.2011
comment
ฉันค่อนข้างแน่ใจว่าเมื่อฉันใช้เทมเพลต ฉันไม่จำเป็นต้องกังวลเกี่ยวกับการบังคับให้ดัชนีแสดง ฯลฯ ฉันเชื่อว่าเมื่อคุณใช้ EditorFor ในรายการ และคุณมีเทมเพลตตัวแก้ไขสำหรับแต่ละรายการที่ประกอบกันเป็นรายการ โดยจะวนซ้ำและดูแลการเชื่อมโยงโดยอัตโนมัติ ฯลฯ - person Shea Daniels; 10.02.2011
comment
ฉันรู้ว่ามันใช้งานได้โดยไม่ต้องสร้างดัชนีเมื่อโมเดลนั้นเป็นรายการ อย่างไรก็ตาม ฉันประสบปัญหาหากไม่มีการจัดทำดัชนีในกรณีที่โมเดลมีรายการเป็นหนึ่งในคุณสมบัติ ฉันสนับสนุนอย่างแน่นอนว่าสหกรณ์ลองดูก่อนที่จะลดราคา มันดูสะอาดขึ้นมากถ้าไม่มีวงเล็บ - person Mayo; 10.02.2011
comment
ฉันลองทำตามวิธีของ Shea ก่อน แต่ดูเหมือนจะไม่ได้ผล ตอนนี้ฉันได้อ่านโพสต์ของเขาอีกครั้ง ฉันคิดว่าฉันพลาดที่จะเข้าใจเขา ฉันสร้างเทมเพลตโดยยอมรับ List<TeamMember> แทนที่จะเป็น TeamMember อย่างไรก็ตาม ฉันเลือกใช้ตัวเลือกดัชนีและมันก็ใช้งานได้ดี ฉันจะดูว่าฉันจะทำให้มันทำงานกับเทมเพลตได้หรือไม่เมื่อถึงเวลา ขอบคุณทั้งสองท่าน! - person MisterIsaak; 10.02.2011
comment
ใช่แล้ว ฉันเจออุปสรรคเหมือนกัน เทมเพลตไม่ได้มีไว้สำหรับรายการ แต่สำหรับแต่ละรายการ MVC วนซ้ำในรายการและใช้เทมเพลตตัวแก้ไขบ่อยเท่าที่จำเป็น โดยจะเติม ID ของรายการไว้หน้า ID ของรายการโดยอัตโนมัติด้วยชื่อของคอลเลกชันที่เป็นเจ้าของและตำแหน่งของรายการในคอลเลกชัน - person Shea Daniels; 10.02.2011

ลองใช้สิ่งนี้:

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

จากนั้น สร้างเทมเพลตตัวแก้ไขที่ใช้ร่วมกันด้วยประเภทโมเดล TeamMember MVC ควรจัดการการเชื่อมโยงทุกอย่างกลับไปที่โมเดลมุมมองของคุณในโพสต์สำหรับคุณ

person Shea Daniels    schedule 09.02.2011