2

我有一个包含几行数据的表,我需要将这些数据返回给控制器。在我看来,我最初通过选择时间段并单击按钮来加载表格。该表加载了我所有的相关记录,但我的一个表单元格包含一个下拉列表。所以我应该能够在下拉菜单中进行选择,点击“更新”,我的控制器会保存更改。

所以一切正常,直到我尝试保存。发送到控制器的模型完全为空。我绑定到表格单元格的列表属性返回到控制器 null。

 @ModelType SuperViewModel
 //We need this a view model in order to store a List of the models in the table   

 @Using (Html.BeginForm())
 @For Each i in Model.CompleteList
    Dim currentItem = i //MVC auto-generated extra declarations. Seems redundant to me but it works.
 @<table>
 <tr>
 <td>@Html.DisplayFor(function(Model)currentItem.Name)</td>
 <td>@Html.DisplayFor(function(Model)currentItem.SampleTime)</td>
 <td>@Html.DropDownListFor(function(Model)currentItem.WorkTime, ViewBag.WorkTimeList)</td>
 </tr>
 Next
 </table>
 <input name="submit" type="submit" value="Update"/>
 End Using

 //Controller
 <HttpPost()>
 function Save(vmodel as SuperViewModel, submit as String) as ActionResult //NOTE: submit parameter is used because we have two submit buttons but its not relevant here
      if submit = "Update"
            db.Entry(vmodel.CompleteList).State = EntityState.Modified//Here the exception is throw because our list is null at this point even tho its tied to the model in the view.
            db.SaveChanges()
      end if
 End Function

注意:这是用 VB.NET 编写的,但欢迎使用 C# 帮助。我熟悉 MVC 中的两种语言。

4

3 回答 3

2

您需要使用 for 迭代器并让视图使用 HTML 元素的索引元素。我不知道 VB.NET 语法,下面是 c# 示例。这允许模型绑定器正确确定视图模型中的元素,以便它可以在回发时重新填充视图模型。

<table>
 @For(var i = 0; i < Model.CompleteList.Count; i++) 
{
 <tr>
 <td>@Html.DisplayFor(Model.CompleteList[i].Name)</td>
 <td>@Html.DisplayFor(Model.CompleteList[i]..SampleTime)</td>
 <td>@Html.DropDownListFor(Model.CompleteList[i]..WorkTime, ViewBag.WorkTimeList)</td>
 </tr>
}
 </table>

您的 post 方法应该可以正常工作。

于 2012-04-24T02:15:56.900 回答
0

我需要查看由 生成的标记中的名称DropDownListFor,但我怀疑这是因为currentItem您正在绑定CompleteList类型,但您的控制器方法需要完整SuperViewModel类型。您显示的代码中没有任何地方表明您绑定到该SuperViewModel类型。

尝试将您的控制器方法更改为:

<HttpPost()>
 function Save(currentItem as CompleteList, submit as String) as ActionResult //NOTE: submit parameter is used because we have two submit buttons but its not relevant here
      if submit = "Update"
            db.Entry(vmodel).State = EntityState.Modified//Here the exception is throw because our list is null at this point even tho its tied to the model in the view.
            db.SaveChanges()
      end if
 End Function

WorkTime属性应使用 DropDownList 中的选定值填充。

编辑:更改参数名称以匹配绑定名称。

于 2012-04-23T23:37:29.340 回答
0

由于参数名称中的某些冲突,它可能会返回 null(所使用的参数名称也必须在其他地方使用)。尝试这个

<input name="subButton" type="submit" value="Update"/>

和改变

function Save(vm as SuperViewModel, subButton as String) as ActionResult
于 2012-04-23T23:22:24.383 回答