MVC复杂对象绑定

时间:2011-08-22 10:28:54

标签: asp.net-mvc asp.net-mvc-3 asp.net-mvc-2

我正在使用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(); %>

我的问题是我的操作的传递模型始终为null

[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 个答案:

答案 0 :(得分:3)

我认为您必须Questionnaire实施ICollection<Question>,然后按照Phil Haack's post中的详细说明进行操作。如果您不希望Questionnaire实施ICollection<Question>,我认为您需要实施Questionnaire类型的自定义模型活页夹。

答案 1 :(得分:1)

这是您的部分代码,未经过测试。我假设一个基于零的QuestionNumber:

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

答案 2 :(得分:0)

完整答案:MVC post a list of complex objects 其中包含Phil Haack的解决方案和另一个解决方案:

@for (var itemCnt = 0; itemCnt < Model.Questions.Count(); itemCnt++)
{
    @Html.TextBoxFor(m => Model.Questions[itemCnt].Body)
    ....
    @Html.HiddenFor(m => Model.Questions[itemCnt].QuestionNumber )
}