我正在构建一个CBT内容管理器网络应用程序。
我将在每个问题上处理数百个问题列表和4个答案。
顺便说一下,模型如下。
public partial class CbtItem : AldesiMongoBase<CbtItem>
{
[Browsable(false)]
public ObjectId id { get; set; }
public string CbtClass { get; set; }
public string Inning { get; set; }
public string Sort { get; set; }
public string Subject { get; set; }
public string Question { get; set; }
public string QuestionImage { get; set; }
public List<Answer> Answers { get; set; }
}
答案课是......
public partial class Answer
{
[BsonIgnore]
public ObjectId ParentId { get; set; }
public string Sort { get; set; }
public string AnswerText { get; set; }
public string AnswerImage { get; set; }
public bool IsAnswer { get; set; }
}
使用这些模型的视图。
@model IEnumerable<Aldesi.Model.CbtItem>
@{
ViewBag.Title = "input data";
}
<script type="text/javascript">
$(document).ready(function (e) {
$('#ajaxCall').click(function (e) {
});
});
</script>
<div id="subHeader">
<h2>@Html.Raw(string.Format("{0} {1} ", Request.Params["cbtclass"], Request.Params["inning"]))</h2>
<div id="ajaxCall" class="createTestButton aldesi-button">
<span>
Submit
</span>
</div>
</div>
<table class="table">
<tr>
<th>
@Html.DisplayNameFor(model => model.Sort)
</th>
<th>
@Html.DisplayNameFor(model => model.Subject)
</th>
<th>
@Html.DisplayNameFor(model => model.Question)
</th>
<th>
@Html.DisplayNameFor(model => model.QuestionImage)
</th>
<th>
@Html.DisplayNameFor(model => model.Answers)
</th>
</tr>
@foreach (var item in Model)
{
<tr class="cbtItems">
<td>
@Html.DisplayFor(modelItem => item.Sort)
</td>
<td>
@Html.TextBoxFor(modelItem => item.Subject)
</td>
<td>
@Html.TextBoxFor(modelItem => item.Question)
</td>
<td>
@Html.TextBoxFor(modelItem => item.QuestionImage)
</td>
<td class="ansItems">
@if (item.Answers != null)
{
foreach (var ansItems in item.Answers)
{
@Html.DisplayFor(modelItem => ansItems.Sort)
@Html.TextBoxFor(modelItem => ansItems.AnswerText)
@Html.TextBoxFor(modelItem => ansItems.AnswerImage) <br />
}
}
</td>
</tr>
}
</table>
}
此视图适用于编辑和列表视图。
我可以通过更新来编辑项目或创建新项目。
我想要做的是只需一次提交即可插入或更新数据列表。
但MVC似乎通过表单提交与服务器通信,所以我认为我需要一个解决方法。
该视图将绘制100个字段和800个答案字段,这些字段将具有相同的ID和名称,这意味着表单提交将只消耗100个中的一个列表。
有什么想法吗? Ajax是最佳人选吗?
答案 0 :(得分:0)
不要使用foreach
循环...使用for
循环并遍历集合/列表的索引......
此外,您还需要为模型使用List<T>
... IEnumerable<T>
没有索引器,因此您将无法使用它。
@for (int i = 0; i < Model.Count(); i++)
{
<tr class="cbtItems">
<td>
@Html.DisplayFor(modelItem => Model[i].Sort)
</td>
<td>
@Html.TextBoxFor(modelItem => Model[i].Subject)
</td>
<td>
@Html.TextBoxFor(modelItem => Model[i].Question)
</td>
<td>
@Html.TextBoxFor(modelItem => Model[i].QuestionImage)
</td>
<td class="ansItems">
@if (Model[i].Answers != null)
{
for (int j = 0; j < Model[i].Answers.Count(); j++)
{
@Html.DisplayFor(modelItem => Model[i].Answers[j].Sort)
@Html.TextBoxFor(modelItem => Model[i].Answers[j].AnswerText)
@Html.TextBoxFor(modelItem => Model[i].Answers[j].AnswerImage) <br />
}
}
</td>
</tr>
}
答案 1 :(得分:-1)
对于其他有绑定集合问题的人,
您可以查看BeginCollectionItem帮助器。它为您处理这个问题,并且可以很好地处理具有多个集合的复杂viewModel,处理验证并保持您的视图干净。由于它仍然使用默认的模型绑定器,它将支持普通和ajax帖子。
您可以找到大量的文档。它在带有剃刀的MVC5中工作(旧示例中未显示) 示例 - http://blog.stevensanderson.com/2010/01/28/editing-a-variable-length-list-aspnet-mvc-2-style/