ASP MVC嵌套数组模型绑定

时间:2012-10-11 19:33:25

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

我有以下简单的模型:

public class MainModel
{
    public int Id {get;set;}
    public List<Question> Questions {get;set;}
}

public class Question
{
    public string Text {get;set;}
    public List<Answer> Answers {get;set;}
}

public class Answer
{
    public byte No {get;set;}
    public string Text {get;set;}
    public bool Correct {get;set;}
}

我有一个强类型的MainModel视图,它允许用户为每个问题添加自定义数量的问题和答案(并删除它们)。

我正在使用该方法添加隐藏的索引字段,它对于问题级别正常工作(POST上包含动态添加的问题)。但是,当涉及动态添加的答案时,它无法正常工作。这是我已经渲染的HTML:

<div class="answer">
<input type="hidden" value="1" name="Questions[2].Answers.Index">
<input type="checkbox" data-checkbox-for="Questions[2].Answers[1].Correct" checked="checked">
<input type="hidden" value="1" name="Questions[2].Answers[1].No">
<input type="text" value="2.1" name="Questions[2].Answers[1].Text">
<input type="hidden" value="true" name="Questions[2].Answers[1].Correct">
<span class="remove-answer link">Remove</span>
</div>

我在这里做错了什么?

2 个答案:

答案 0 :(得分:1)

你从零索引开始吗?

 <div class="answer">
<input type="hidden" value="1" name="Questions[2].Answers.Index">
<input type="checkbox" data-checkbox-for="Questions[2].Answers[0].Correct" checked="checked">
<input type="hidden" value="1" name="Questions[2].Answers[0].No">
<input type="text" value="2.1" name="Questions[2].Answers[0].Text">
<input type="hidden" value="true" name="Questions[2].Answers[0].Correct">
<span class="remove-answer link">Remove</span> 

如果你不从0开始计数,你就不会得到任何帖子值,因为mvc在索引1之前想要索引0

以下属性不在您的模型中,是吗?

<input type="hidden" value="1" name="Questions[2].Answers.Index">

答案 1 :(得分:0)

以下是解决这个问题的方法:

Model Binding To List Of Objects In ASP.NET MVC

确保使用某种randomness添加隐藏索引。这样,您可以在各种索引值之间产生“差距”。

这样的事情:

var random = new Random(10);
var rnd = random.Next();

@Html.Hidden("Questions[" + (i) + "].Answers.Index", i + j + rnd)
@Html.TextBox("Questions[" + (i) + "].Answers[" + (i + j + rnd) + "].Text", Model.Questions[i].Answers[j].Text, new { @class = "form-control" })