如何从视图中获取列表/数组回到控制器

时间:2011-12-07 01:02:25

标签: c# asp.net-mvc-3 list view controller

我的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代码。 :(

1 个答案:

答案 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会惩罚你。