我正在尝试使用asp.net mvc 4
& EF6
我希望一次更新多行。但由于某种原因,它不起作用&我收到这样的错误,
System.NullReferenceException:未将对象引用设置为对象的实例
以下是我的代码,
控制器
[HttpPost]
public ActionResult MakeDue(List<BillCheck> BillLists)
{
if (Session["username"] != null)
{
if (ModelState.IsValid)
{
foreach (var BillId in BillLists)
{
var getDue = db.BillChecks.Where(p => p.id == BillId.id).FirstOrDefault();
getDue.due = BillId.due;
}
db.SaveChanges();
return RedirectToAction("Success");
}
else
{
return RedirectToAction("Failed");
}
}
else
{
return RedirectToAction("Login");
}
}
查看
@using (Html.BeginForm("MakeDue", "Home"))
{
@Html.ValidationSummary(true)
@foreach(var item in Model.DueList)
{
@Html.HiddenFor(modelItem => item.id)
<tr>
<td>@Html.DisplayFor(modelItem => item.flat)</td>
<td>@Html.DisplayFor(modelItem => item.name)</td>
<td>@Html.TextBoxFor(modelItem => item.due)</td>
</tr>
}
<input type="submit" class="btn btn-success" value="Update" />
}
我的代码中有什么问题吗?如何更新一次提供的due
的所有输入?
答案 0 :(得分:23)
您的第一个问题是您使用foreach
循环生成重复的name
属性,这些属性不会绑定到集合,因此BillLists
参数将始终为空集合(它还生成重复的id
属性,这些属性是无效的html)。您需要为for
类型使用EditorTemplate
循环或自定义BillCheck
。使用for
循环,您的视图需要
using (Html.BeginForm("MakeDue", "Home"))
{
@Html.ValidationSummary(true)
@for(int i = 0; i < Model.DueList.Count; i++)
{
<tr>
<td>
@Html.HiddenFor(m => m.DueList[i].id)
@Html.DisplayFor(m => m.DueList[i].flat)</td>
<td>@Html.DisplayFor(m => m.DueList[i].name)</td>
<td>@Html.TextBoxFor(m => m.DueList[i].due)</td>
</tr>
}
<input type="submit" class="btn btn-success" value="Update" />
}
另请注意,@Html.HiddenFor()
帮助程序需要位于<td>
元素内才能成为有效的html。
下一个问题是视图中的模型不是List<BillCheck>
的类型,但它包含名为DueList
的属性,其类型为List<BillCheck>
,因此您的POST方法需要< / p>
public ActionResult MakeDue(YourModel model)
其中YourModel
是您用于生成视图的类名(即@model ???
语句中)。然后你需要在控制器方法中循环
foreach (var BillId in model.DueList)
{
var getDue = db.BillChecks.Where(p => p.id == BillId.id).FirstOrDefault();
if (getDue != null) // add this
{
getDue.due = BillId.due;
}
}
db.SaveChanges();
另请注意添加if (getDue != null)
支票
旁注:您正在查看if (ModelState.IsValid)
。建议您返回ModelState
无效的视图,以便用户可以更正任何错误。