我有以下问题 - 我正在开发一个ASP.NET MVC 3应用程序,我有一个强类型的视图。由于数据的复杂性,视图中的模型如下所示:
@model List<List<DataAccess.MCS_DocumentFields>[]>
然后我渲染这样的视图:
@using (Html.BeginForm("ActionMethodName", "Forms"))
{
<table border="1">
<tbody>
@for (int i = 0; i < Model.Count(); i++)
{
if (Model[i][0][0].ContentTypeId == 1)
{
@Html.Partial("_PartialHeader", Model[i])
}
else if (Model[i][0][0].ContentTypeId == 2)
{
@Html.Partial("_PartialDrawing", Model[i])
}
else if (Model[i][0][0].ContentTypeId == 3)
{
@Html.Partial("_PartialBody", Model[i])
}
else if (Model[i][0][0].ContentTypeId == 4)
{
@Html.Partial("_PartialFooter", Model[i])
}
}
</tbody>
</table>
<button type="submit">Save</button>
}
这是我的部分观点之一:
if (string.IsNullOrEmpty(item.FieldValue))
{
<td colspan="2">
@Html.DisplayFor(y => y[i][0].QuestionText)
@Html.HiddenFor(y => y[i][0].QuestionText)
</td>
}
else
{
<td colspan="2">
@Html.DisplayFor(y => y[i][0].QuestionText)
@Html.HiddenFor(y => y[i][0].QuestionText)
:
@Html.DisplayFor(y => y[i][0].FieldValue)
@Html.HiddenFor(y => y[i][0].FieldValue)
</td>
}
这只是一个片段,我想说的是我的表至少有8-9行,而且每行几乎都有@Html.HiddenFor
所以我希望在提交表单时获取数据。< / p>
在我的控制器中,我有这种方法:
[HttpPost]
public ActionResult ActionMethodName(List<MCS_DocumentFields>[] collection)
{
var test = collection;
List<MCS_Documents> model = DocumentService.All().ToList();
return View("Index", model);
}
我为collection
参数尝试了很多不同的类型。大部分时间我都是null,充其量我得到前两行(不知道为什么到前两行)但仅此而已。如果我使用FormCollection
,那么我会提交所有提交的数据,但它与我的MCS_DocumentFields
课程无关。
我不知道我做错了什么。我不认为应该猜测方法的类型我认为它必须由某些东西决定,如果代码中有一些问题(最有可能在局部视图中),因为我已经在这里发布了几乎所有的主视图,那么为什么我的逻辑不起作用以及为什么我不能将数据绑定到模型的原始类型的任何建议?
答案 0 :(得分:1)
我建议你看看BeginCollectionItem包(http://nuget.org/packages/BeginCollectionItem/),虽然我可以看到你的模型非常复杂(3维),但是你必须以非常讨厌的方式嵌套它们。
此外,您应该考虑(由于您的模型复杂性)创建自定义模型绑定器(http://www.codeproject.com/Articles/605595/ASP-NET-MVC-Custom-Model-Binder)。
最后一句话 - 您在View中的模型与您期望的模型不同:
列出&lt; MCS_DocumentFields&gt; [] collection!= List&lt; List&lt; DataAccess.MCS_DocumentFields&gt; []&gt;
伊万