C# 使用mvc4视图到控制器处理嵌套集合
我为一个我认为应该简单的概念奋斗了几个小时。我有一个模型,它本质上是一个包含一系列问题的测验,而这些问题又有一系列答案。以下是我的模型示例(简化): 我已经尝试了很多不同的建议。直接绑定到模型中的单个值非常容易,我甚至可以让我的pQuizModel在视图中看到正确的隐藏部分。但是模型中没有其他东西会被填充,我也不知道为什么\C# 使用mvc4视图到控制器处理嵌套集合,c#,asp.net-mvc,asp.net-mvc-4,C#,Asp.net Mvc,Asp.net Mvc 4,我为一个我认为应该简单的概念奋斗了几个小时。我有一个模型,它本质上是一个包含一系列问题的测验,而这些问题又有一系列答案。以下是我的模型示例(简化): 我已经尝试了很多不同的建议。直接绑定到模型中的单个值非常容易,我甚至可以让我的pQuizModel在视图中看到正确的隐藏部分。但是模型中没有其他东西会被填充,我也不知道为什么\ 编辑:为了澄清我的问题,视图很好,但控制器在pQuizModel参数中没有收到任何值。我没有正确的绑定设置,需要一些帮助。问题不在于初始页面的Razor呈现,而是结果帖子上
编辑:为了澄清我的问题,视图很好,但控制器在pQuizModel参数中没有收到任何值。我没有正确的绑定设置,需要一些帮助。问题不在于初始页面的Razor呈现,而是结果帖子上的模型绑定器(在他们按下按钮后)。模型绑定器对如何将ID映射到嵌套项进行了某些假设。因为在形成Razor代码时没有遵循约定,所以它没有填充方法的输入属性。请参阅类似示例。那么问题出在哪里??是您的视图填充不正确还是什么?视图填充得很完美。挑战在于,当用户提交答案时,控制器的pQuizModel根本没有填充。正如我所说,它填充的唯一内容是pQuizModel.Id,因为我使用视图中的隐藏字段进行测试。绑定到单个属性很简单,嵌套不多。你的意思是,当你提交表单时,你在pQuizModel隐藏字段中没有值,对吗?我猜你不会在每次使用相同id在DOM中呈现pQuizModel隐藏字段时都得到值bcs。所以你需要做的是提供像这样的唯一id-
@Html.hidden(“id”,Model.id,new{Id=“pQuizModel”+Model.Id})
。试试看。请发布你的pQuizModel。
public class QuizModel
{
public List<Question> Questions { get; set; }
}
public class Question
{
public string TheQuestion { get; set; }
public List<Answer> Answers { get; set; }
}
public class Answer
{
public string Value { get; set; }
}
@using (Html.BeginForm("SubmitQuiz", "Quiz", FormMethod.Post, new { role = "form" }))
{
<ol>
@{
@Html.Hidden("Id", Model.Id, new { Id="pQuizModel"})
for (int vQIndex = 0; vQIndex < Model.Questions.Count; vQIndex++)
{
<li>
@Model.Questions.ElementAt(vQIndex).Question
<ul class="list-unstyled">
@{
for (int vAIndex = 0; vAIndex < Model.Questions.ElementAt(vQIndex).Answers.Count; vAIndex++)
{
<li>@Html.RadioButtonFor(pModel => pModel.Questions.ElementAt(vQIndex).SelectedAnswer, Model.Questions.ElementAt(vQIndex).Answers.ElementAt(vAIndex).Value) @Model.Questions.ElementAt(vQIndex).Answers.ElementAt(vAIndex).Value</li>
//<li>@Html.RadioButton(Model.Questions.ElementAt(vQIndex).Id.ToString() + ":" + Model.Questions.ElementAt(vQIndex).Answers.ElementAt(vAIndex).Id, Model.Questions.ElementAt(vQIndex).Answers.ElementAt(vAIndex).Id)
// @Model.Questions.ElementAt(vQIndex).Answers.ElementAt(vAIndex).Value</li>
}
}
</ul>
</li>
}
}
</ol>
<button type="submit" class="btn btn-default">Submit</button>
}
public ActionResult SubmitQuiz(QuizModel pQuizModel)
{
return View();
}