【问题标题】:Getting List<ViewModel> from View into Controller将 List<ViewModel> 从 View 获取到 Controller
【发布时间】:2013-09-09 09:18:29
【问题描述】:

我有一个View,它允许编辑ListViewModel。该代码一直有效,直到显示功能。但我无法从视图中取回同一列表中的值。

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

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

POST 函数列表中的值为空。 我怎样才能从视图中获取值到控制器中。

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

无法将带有 [] 的索引应用于“System.Collections.Generic.IEnumerable”类型的表达式

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

编辑 2: 我将 @model IEnumerable&lt;ViewModel&gt; 更改为 @model List&lt;ViewModel&gt; 并且错误无法使用 [] 将索引应用于类型为 'System.Collections.Generic.IEnumerable 的表达式已得到纠正。

编辑 3: 我能够将TextboxCheckBox 的值输入控制器,但是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>

                        }
                    }
}

【问题讨论】:

  • 请添加更多关于视图的代码,例如
    html 标签在哪里?
  • @ElvinArzumanoğlu - 这与当前情况无关。我只包含了需要的内容。
  • 如果您有新问题,请发布新问题。不要用独立的问题不断更新你现有的问题,因为你最终会在同一个列表中得到不同问题的答案。你已经解决了你的问题——你的模型是有约束力的。您的 RadioButtons 和 DropDownLists 的问题是分开的。
  • @AntP - 这是同一个问题。这就是它更新的原因。

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


【解决方案1】:

我建议:

  1. 使用强类型视图
  2. 使用for(i = 0; ...; ...) 循环,否则它不会简单地工作

另一种方法可能是(请不要使用这种方法):

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

【讨论】:

  • 我已经更新了我的问题。看看你的答案是否是这种情况下的解决方案
  • @Rohit,我不是判断我的答案是否正确的合适人选。选择该答案作为逻辑上正确的解决方案(以便其他读者不会误导)以及为您提供解决方案或指导您找到解决方案的答案:)
  • @Rohit,for(i = 0;...;...) 循环在哪里?
  • 我用for(i=0;;)替换了foreach循环
【解决方案2】:

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

【讨论】:

  • 我看过它并尝试使用它。但遇到以下错误:Cannot apply indexing with [] to an expression of type 'System.Collections.Generic.IEnumerable&lt;ViewModell&gt;
  • 您需要更改视图中的类型,以使用 List 而不是 Ienumerable
  • 视图中的模型声明应该是:@model List
  • 是的,已经更正了。见编辑。但我仍然得到空值。
  • 你能用
    标签发布当前视图吗?
【解决方案3】:

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

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

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

【讨论】:

  • 问题是我有不止一种类型,如 TextBox、CheckBox、RadioButton、DropDownList 等
  • 你的意思是你对同一个属性有不止一种类型的控制。?但是,如果您的意思是您有其他控件,例如复选框或单选按钮或用于不同属性的下拉列表,那么您也可以通过使用带有 for 标记的控件来获取这些控件的选定值,就像我为文本框所解释的那样,但合适的数据类型如复选框等需要不可为空的布尔值..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-22
相关资源
最近更新 更多