Обязательные коллекции в MVC - PullRequest
4 голосов
/ 09 февраля 2011

У меня есть модель представления, которая состоит из объекта Applicant и коллекции TeamMember. Когда я отправляю модель обратно, коллекция Team всегда пуста. Я пытался изменить коллекцию с моего IEnumarable на List, но это не имело значения. Поэтому я изменил действие Controllers Edit для принятия 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              
}

View

<% using (Html.BeginForm())
       {%>
    <h3>
    <a href="#">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="#">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>
    <% } %>

Ответы [ 2 ]

5 голосов
/ 10 февраля 2011

Я считаю, что входные теги, связанные с элементами в коллекции (если сама модель не является коллекцией), должны иметь индекс в атрибуте имени, прежде чем можно будет связать опубликованные данные с моделью представления. Вот как я обычно это делаю ...

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

Я также использовал шаблон, предложенный Ши, но у меня есть немного кода, пытающегося заставить его отображать скобки / индексы.

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

Вот старая, но все еще актуальная статья от Фила Хаака по теме.

1 голос
/ 09 февраля 2011

Попробуйте использовать это:

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

Затем создайте шаблон общего редактора с типом модели TeamMember. MVC должен обработать привязку всего к вашей модели представления в сообщении для вас.

...