我的ViewResult控制器:
public ViewResult Controller(int id)
{
List<Data> dataList = dataAccess.getDataById(id);
Results[] resultArray = new Results[dataList.Count];
ViewBag.results= resultArray;
return View(dataList);
}
我的观点:
@model IEnumerable<Solution.Models.Data>
@{
Solution.Models.Results[] res= ViewBag.results;
}
@using (Html.BeginForm()) {
<table>
@{
int i = 0;
foreach (var item in Model) {
<tr>
<td>
Snippet: @Html.DisplayFor(modelItem => item.text)
</td>
</tr>
<tr>
<td>
Translation: @Html.EditorFor(modelItem => res[i].text)
</td>
</tr>
i++;
}
}
</table>
<p>
<input class="CRUD-buttons" type="submit" value="Send" />
</p>
}
我的控制器ActionResult:
[HttpPost]
public ActionResult Controller(/*List<Data> dataList, */Results[] results)
{
ResultText = results[0].text; //NullReferenceException
}
dataList和结果为空。我在stackoverflow上阅读了几篇帖子,但找不到解决方案。
我已经看了下面的博客(link),但是它的MVC 2代码。 :(
答案 0 :(得分:1)
有多种方法可以做到这一点。您在这里得到的是,为了让您收到results
参数,生成的修改控件的name
对于第一个results[0]
,对于第二个results[1]
等,索引中没有间隙(这是因为发布表单时how DefaultModelBinder
expects to find the fields named)。
因此,一个即时(虽然不是很好)的解决方案是正确指定名称:
@Html.TextBox(string.Format("results[{0}]", i), res[i].text)
更好的解决方案是将results
放入您的模型中(更好的是,在专门为此视图创建的ViewModel中)。例如,首先创建一个封装一个数据的类和相应的结果:
class ItemViewModel
{
Solution.Models.Data TheData { get; set; }
Solution.Models.Results TheResults { get; set; }
}
然后,您的视图会将这些项目的集合作为其模型:
@model IEnumerable<ItemViewModel>
然后使用
输出编辑控件Translation: @Html.EditorFor(modelItem => modelItem.TheResults)
最后,您修改回发操作以接受ItemViewModel
:
[HttpPost]
public ActionResult Controller(ItemViewModel[] results)
一般性建议:尽量避免将EditorFor
与不属于视图模型的对象一起使用(例如,您通过ViewBag
传递的内容或{ {1}})。如果你这样做,MVC会惩罚你。