Связывание сложных объектов MVC - PullRequest
0 голосов
/ 22 августа 2011

Я использую MVC, имейте следующую модель

public class Questionnaire 
     {
     public string Name { get; set; }
     public List<Question> Questions { get; set; }
 }

и класс Вопроса:

public class Question 
 {
     public int QuestionNumber { get; set; }
     public string Body { get; set; }
     public IList<Option> Options { get; set; }
     //public IEnumerable<CreativeFactory.Option> OptionsTemp { get; set; }
     public Guid? QuestionnaireId { get; set; }
     public Guid? SelectedOption { get; set; }
     public int? SelectedEmployeeId { get; set; }

  } 

В моем представлении я делаю foreach и частично отображаю представление

    % Html.BeginForm("Submit", "Questionnaire", FormMethod.Post); %>
    <%

    foreach (var q in Model.Questions)
    {
    Html.RenderPartial("Question", q);
    }
    %>
    <input type="submit" name="submit" value="submit" />
    <% Html.EndForm(); %>

Моя проблема в том, что переданная модель для моего действия всегда равна нулю

[AcceptVerbs(HttpVerbs.Post)]
         public ActionResult Submit(Questionnaire m)
         {
}

РЕДАКТИРОВАТЬ 1: Ну, мой код частичного просмотра:

<%
 foreach (var option in Model.Options)
 {%>
   <p/>
 <%= Html.RadioButtonFor(x => x.SelectedOptionId, option.QuestionId, new { id = "test" +    option.ID })%>
<%
}     
%>

Даже вВ режиме отладки я не могу найти свою коллекцию в экземпляре Form, поэтому даже пользовательская привязка не решит проблему, потому что коллекция не существует

Любая идея, пожалуйста?

Ответы [ 3 ]

3 голосов
/ 22 августа 2011

Я думаю, вы должны заставить Questionnaire реализовать ICollection<Question>, а затем следовать этим подробным инструкциям в посте Фила Хаака . Если вы не хотите, чтобы Questionnaire реализовывал ICollection<Question>, я думаю, вам нужно реализовать пользовательское связующее для модели типа Questionnaire.

1 голос
/ 22 августа 2011

Это код вашего частичного, не проверенного. Я предположил, что вопросник основан на нуле:

<input type="hidden" name="Questions[<%= Model.QuestionNumber %>].QuestionNumber" value="<%= Model.QuestionNumber %>" />
<% foreach (var option in Model.Options) { %>
  <input type="radio" name="Questions[<%= Model.QuestionNumber %>].SelectedOptionId" value="<%= option.ID %>" /><%= option.Text %>
<% } %>
0 голосов
/ 05 декабря 2014

Полный ответ: MVC опубликовать список сложных объектов который содержит решение Фила Хаака и еще одно:

@for (var itemCnt = 0; itemCnt < Model.Questions.Count(); itemCnt++)
{
    @Html.TextBoxFor(m => Model.Questions[itemCnt].Body)
    ....
    @Html.HiddenFor(m => Model.Questions[itemCnt].QuestionNumber )
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...