Asp.net mvc MVC复杂对象绑定

Asp.net mvc MVC复杂对象绑定,asp.net-mvc,asp.net-mvc-3,asp.net-mvc-2,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; } } 编辑1: 我的部分视图代码是: <% foreach (var option in Model.Options) {%> <p/> <%= Html.Radio

我使用的是MVC,有以下模型

public class Questionnaire 
     {
     public string Name { get; set; }
     public List<Question> Questions { get; set; }
 }
编辑1: 我的部分视图代码是:

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

x、 SelectedOptionId,option.QuestionId,new{id=“test”+option.id})%>

即使在调试模式下,我也无法在表单实例中找到我的集合 因此,即使是自定义绑定也不能解决问题,因为集合不存在


有什么想法吗?

我想你必须制作
调查问卷
实施
I收集
,然后按照中的详细说明进行操作。如果您不希望
问卷
实现
ICollection
,我认为您需要实现
问卷
类型的自定义模型活页夹。

我认为您必须制作
问卷
实现
ICollection
,然后按照中的详细说明进行操作。如果您不希望
调查问卷
实现
ICollection
,我认为您需要实现
调查问卷
类型的自定义模型绑定器。

这是针对您的未测试部分的代码。我假设一个从零开始的数字:

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

这是部分测试的代码,未经测试。我假设一个从零开始的数字:

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

完整答案: 其中包含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 )
}
(var itemCnt=0;itemCntModel.Questions[itemCnt].Body) .... @Html.HiddenFor(m=>Model.Questions[itemCnt].QuestionNumber) } 完整答案: 其中包含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 )
}
(var itemCnt=0;itemCntModel.Questions[itemCnt].Body) .... @Html.HiddenFor(m=>Model.Questions[itemCnt].QuestionNumber) }
我实现了ICollection,并检查了上面的链接,但仍然存在相同的问题,您认为Html.RenderPartial(“问题”,q)?很难说,除非你为RenderPartial发布代码。一般来说,如果生成的HTML符合该帖子中指定的规则,则应该没有问题。局部视图中的输入应具有类似“Questions[i].QuestionNumber”的名称,其中i是问题的索引(从零开始)。您应该将索引传递给分部(或使用QuestionNumber作为索引,但确保第一个索引为零),并检查您是否为输入生成了正确的名称,以便模型绑定器能够完成它的工作。Eduardo Campano,请您根据代码澄清您的解决方案above@Aboelnil:爱德华多·坎帕诺是对的,以及Buu Nguyen的回答。关于它的更多细节,请参考本文。我实现了ICollection,并检查了上面的链接,但仍然存在相同的问题,您认为Html.RenderPartial(“问题”,q)?很难说,除非你为RenderPartial发布代码。一般来说,如果生成的HTML符合该帖子中指定的规则,则应该没有问题。局部视图中的输入应具有类似“Questions[i].QuestionNumber”的名称,其中i是问题的索引(从零开始)。您应该将索引传递给分部(或使用QuestionNumber作为索引,但确保第一个索引为零),并检查您是否为输入生成了正确的名称,以便模型绑定器能够完成它的工作。Eduardo Campano,请您根据代码澄清您的解决方案above@Aboelnil:爱德华多·坎帕诺是对的,以及Buu Nguyen的回答。有关详细信息,请参阅此。请检查局部视图呈现的元素ID。这些是默认模型绑定器支持的表单吗?参考Phil Haack关于“模型绑定到列表”的帖子,请检查局部视图呈现的元素ID。这些是默认模型绑定器支持的表单吗?请参考Phil Haack关于“模型绑定到列表”的帖子Eduardo,我只有一个问题,我们不使用隐藏字段,为什么在您的示例中使用它关键是将问题与答案关联起来。我在调查问卷中添加了它,以便您在加载属性的操作中收到它,否则它将为零或默认值。如果您检查一下,您将看到在问题库中,每个问题的正文和选项属性中都有null,这是因为模型绑定器在post值中没有找到有关这些属性的信息。如果你删除隐藏字段,你仍然会得到问卷,但你必须使用问题的顺序来知道答案对应的问题。爱德华多,我只有一个问题,请根据,我们不使用隐藏字段,为什么在你的示例中使用它关键是将问题与答案关联起来。我在调查问卷中添加了它,以便您在加载属性的操作中收到它,否则它将为零或默认值。如果您检查一下,您将看到在问题库中,每个问题的正文和选项属性中都有null,这是因为模型绑定器在post值中没有找到有关这些属性的信息。如果你删除隐藏的,你仍然会得到问卷,但你必须使用问题的顺序来知道答案对应的问题。
@for (var itemCnt = 0; itemCnt < Model.Questions.Count(); itemCnt++)
{
    @Html.TextBoxFor(m => Model.Questions[itemCnt].Body)
    ....
    @Html.HiddenFor(m => Model.Questions[itemCnt].QuestionNumber )
}