从View到Controller </viewmodel>获取List <viewmodel>

时间:2013-09-09 09:18:30

标签: c# asp.net-mvc-4

我有View,可以修改List ViewModel。代码一直有效,直到显示功能。但我无法从视图中获取相同列表中的值。

        public ActionResult Funtion()
        {
            List<ViewModel> ViewModel= (List<ViewModel>)TempData["ViewModel"];
            return View(ViewModel);
        }

        [HttpPost]
        public ActionResult UserFormSubmission(List<ViewModel> ViewModel)
        {    
            return View();
        }        

POST函数列表中的值为null。 我如何从视图中获取值到Controller。

编辑: 我尝试使用提到的解决方案来解决问题How to pass IEnumerable list to controller in MVC including checkbox state?。但是遇到了以下错误:

  

无法将带有[]的索引应用于类型为'System.Collections.Generic.IEnumerable

的表达式

此外,我无法理解其中某些标签的用法,例如AntiForgeryTokenHiddenFor等。 所以如果可能的话,请提出一个简单的解决方案或更好的解释。

编辑2:我将@model IEnumerable<ViewModel>更改为@model List<ViewModel>并且错误无法将带有[]的索引应用于类型为'System.Collections.Generic.IEnumerable'的表达式纠正。

编辑3: 我能够将TextboxCheckBox的值加到Controller中,但RadioButtonDropDownList's selected values cant be identified at the [HttpPost]`函数?我在这里缺少什么?

@for (i = 0; i < Model.Count(); ++i)
{
 if (Model[i].TypeId == 4)
                    {
                        //radiobutton
                        for (int j = 0; j < Model[i].Options.Count(); ++j)
                        {
                    <div>
                        @Html.HiddenFor(m => m[i].Options[j].OptionId)                        
                        @Html.HiddenFor(m => m[i].Options[j].OptionValue)
                        @Html.HiddenFor(m => m[i].Options[j].Id)

                        @Html.RadioButtonFor(m => m[i].Options[j].Value, @Model[i].Options[j].DisplayText)
                        @Html.DisplayFor(m => m[i].Options[j].DisplayText)
                    </div>

                        }
                    }
}

3 个答案:

答案 0 :(得分:3)

我建议:

  1. 使用强类型视图
  2. 使用for(i = 0; ...; ...)循环,否则它将无法正常使用
  3. 另一种方法可能是(请不要使用此方法):

    1. 在JS post event
    2. 上创建列表的JSON数组
    3. 使用此数据向控制器发送AJAX POST请求

答案 1 :(得分:1)

您需要使用索引器而不是foreach语句来允许mvc构建您的列表。 类似的问题已经被问到How to pass IEnumerable list to controller in MVC including checkbox state?

答案 2 :(得分:1)

正如#theghostofc建议你可以使用基于索引的循环和控件使用for来生成控件 例如

for(int i=0;i<Model.Count;i++)
{
<tr>
<td>
  @Html.TextBoxFor(model=>Model[i].Text)
</td>
<tr>    
}

在使用模型列表时,在表单提交时,您可以轻松获取它。