Asp.net mvc 为什么我的ViewData列表为空?MVC4

Asp.net mvc 为什么我的ViewData列表为空?MVC4,asp.net-mvc,asp.net-mvc-4,viewdata,Asp.net Mvc,Asp.net Mvc 4,Viewdata,我有两个模型,问答。我想通过ViewModel向一个问题插入一个答案列表,但在我的post方法中,我的列表似乎变为空。这可能也是一个糟糕的实现,因为当我发布一些东西时,我返回了一个问题的模型,我猜我的列表是空的。我怎样才能解决这个问题 编辑:我根据你给我的评论重新制作了控制器和视图:这就是它现在的样子,但我的答案列表似乎又是空的 视图模型: public class ViewModel { public IEnumerable<Answer> Answers { get;

我有两个模型,问答。我想通过ViewModel向一个问题插入一个答案列表,但在我的post方法中,我的列表似乎变为空。这可能也是一个糟糕的实现,因为当我发布一些东西时,我返回了一个问题的模型,我猜我的列表是空的。我怎样才能解决这个问题

编辑:我根据你给我的评论重新制作了控制器和视图:这就是它现在的样子,但我的答案列表似乎又是空的

视图模型:

 public class ViewModel
{
    public IEnumerable<Answer> Answers { get; set; }
    public Question Question { get; set; }
}
公共类视图模型
{
公共数据(IEnumerable');
$.each($trNew.find(':input'),函数(i,val){
//更名
var oldN=$(this.attr('name');
var newN=oldN.replace('['+后缀+']','['+(parseInt(后缀)+1)+']');
$(this.attr('name',newN));
//替换值
var type=$(this.attr('type');
if(type.toLowerCase()=“text”){
$(this.attr('value','');
}
//如果有其他类型,则替换为默认值
$(this).removeClass(“输入验证错误”);
});
$trLast.after($trNew);
//重新分配验证
变量形式=$(“形式”)
.removeData(“验证器”)
.removeData(“不引人注目的验证”);
$.validator.unobtrusive.parse(表单);
});
// 2. 去除
$('a.remove').live(“单击”),函数(e){
e、 预防默认值();
$(this.parent().parent().remove();
});
});
}

视图数据仅用于在视图和控制器之间传输数据。您可以使用会话在控制器之间传输数据

视图从控制器传输到视图时,数据是相关的。它不会发回


您应该使用(模型/参数)绑定,该绑定将负责为您传递
列表应答列表

,ModelBinder要绑定到列表,HTML表单必须按顺序编制索引

你的

@Html.CheckBoxFor(model=>a.CorrectOrNot)
@EditorFor(model=>a.AnswerText)
@EditorFor(model=>a.OpenAnswerText)
是创造一些将与个人答案相联系的东西。您需要呈现将绑定到列表的HTML,如

@for (int i = 0; i < ((List<Answer>)ViewData["Answers"]).Count; i++)
{
    <tr>
         <td>@Html.CheckBoxFor(model=>((List<Answer>)ViewData["Answers"])[i].CorrectOrNot)</td>
         <td>@Html.EditorFor(model=>((List<Answer>)ViewData["Answers"])[i].AnswerText)</td>
         <td>@Html.EditorFor(model=>((List<Answer>)ViewData["Answers"])[i].OpenAnswerText)</td>
    </tr>
}
@for (int i = 0; i < Model.Answers.Count; i++)
{
  <tr>
     <td>@Html.CheckBoxFor(model=> Model.Answers[i].CorrectOrNot)</td>
     <td>@Html.EditorFor(model=> Model.Answers[i].AnswerText)</td>
     <td>@Html.EditorFor(model=> Model.Answers[i].OpenAnswerText)</td>
  </tr>
}
@for(int i=0;i<((列表)视图数据[“答案])。计数;i++)
{
@Html.CheckBoxFor(model=>((List)ViewData[“Answers”])[i].CorrectOrNot)
@Html.EditorFor(model=>((List)ViewData[“Answers”])[i].AnswerText)
@Html.EditorFor(model=>((List)ViewData[“Answers”])[i].OpenAnswerText)
}
而且,这看起来非常糟糕,到处都是视图数据。如果您计划保持这种方法来创建真实的视图模型,通常会更好。您可以将该模型传递给视图,它可以包装问答集合

编辑:

您仍然需要针对您的列表创建一个顺序索引,而您编辑的实现并没有提供该索引。差不多

@for (int i = 0; i < ((List<Answer>)ViewData["Answers"]).Count; i++)
{
    <tr>
         <td>@Html.CheckBoxFor(model=>((List<Answer>)ViewData["Answers"])[i].CorrectOrNot)</td>
         <td>@Html.EditorFor(model=>((List<Answer>)ViewData["Answers"])[i].AnswerText)</td>
         <td>@Html.EditorFor(model=>((List<Answer>)ViewData["Answers"])[i].OpenAnswerText)</td>
    </tr>
}
@for (int i = 0; i < Model.Answers.Count; i++)
{
  <tr>
     <td>@Html.CheckBoxFor(model=> Model.Answers[i].CorrectOrNot)</td>
     <td>@Html.EditorFor(model=> Model.Answers[i].AnswerText)</td>
     <td>@Html.EditorFor(model=> Model.Answers[i].OpenAnswerText)</td>
  </tr>
}
@for(int i=0;imodel.Answers[i].CorrectOrNot)
@Html.EditorFor(model=>model.Answers[i].AnswerText)
@Html.EditorFor(model=>model.Answers[i].OpenAnswerText)
}

谢谢您的评论。他们真的帮助了我。你说的都是对的,但有些东西不见了。ViewModel中的IEnumerable不允许我索引我的值,相反,使用IList帮助我按预期的方式索引所有内容,并且所有内容都正常工作

什么是
返回重定向到操作(“创建”,“问题”,问题)重定向到?您的两个控制器都不将
问题
作为单个参数。另外,一般来说,您应该为页面创建一个包含SelectList的ViewModel,而不是将SelectList存储在ViewBag中。关于编辑,您仍然没有正确创建控件-您需要使用
for
循环-
for(int i=0;im[i].CorrectOrNot)…}
本文还解释了如何使用非顺序索引和顺序索引来实现这一点
@for (int i = 0; i < Model.Answers.Count; i++)
{
  <tr>
     <td>@Html.CheckBoxFor(model=> Model.Answers[i].CorrectOrNot)</td>
     <td>@Html.EditorFor(model=> Model.Answers[i].AnswerText)</td>
     <td>@Html.EditorFor(model=> Model.Answers[i].OpenAnswerText)</td>
  </tr>
}