C# 在asp.net mvc中一次更新多个记录
我正在尝试使用C# 在asp.net mvc中一次更新多个记录,c#,asp.net,asp.net-mvc,C#,Asp.net,Asp.net Mvc,我正在尝试使用asp.netmvc4和EF6创建一个网站,我想一次更新多行。但出于某种原因,它不起作用&我遇到了这样一个错误 System.NullReferenceException:对象引用未设置为对象的实例 这是我的密码 控制器 [HttpPost] public ActionResult MakeDue(List<BillCheck> BillLists) { if (Session["username"] != null) {
asp.netmvc4
和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");
}
}
[HttpPost]
公共行动结果截止日期(清单清单)
{
如果(会话[“用户名”]!=null)
{
if(ModelState.IsValid)
{
foreach(账单列表中的var BillId)
{
var getDue=db.BillChecks.Where(p=>p.id==BillId.id).FirstOrDefault();
getDue.due=BillId.due;
}
db.SaveChanges();
返回操作(“成功”);
}
其他的
{
返回重定向操作(“失败”);
}
}
其他的
{
返回重定向操作(“登录”);
}
}
查看
@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" />
}
使用(Html.BeginForm(“MakeDue”、“Home”))
{
@Html.ValidationSummary(true)
@foreach(Model.DueList中的var项)
{
@Html.HiddenFor(modeleItem=>item.id)
@DisplayFor(modelItem=>item.flat)
@DisplayFor(modelItem=>item.name)
@Html.TextBoxFor(modelItem=>item.due)
}
}
我的代码有问题吗?如何一次更新给定的
due
的所有输入?您的第一个问题是使用foreach
循环会生成重复的name
属性,这些属性不会绑定到集合,因此BillList
参数将始终是空集合(它也会生成重复的id
属性,这是无效的html)。您需要为循环使用,或者为账单检查的类型使用自定义编辑器或模板。使用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" />
}
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();
其中,YourModel
是用于生成视图的类名(即在@model???
语句中)。然后,您需要在控制器方法中循环
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" />
}
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
无效,建议您返回视图,以便用户可以更正任何错误。在您的控制器中getDue
可以为空。DueList
和BillList
看起来像什么?您在哪一行上得到异常?几乎所有NullReferenceExceptio的情况n
相同。请参见“”想要得到一些提示。@JohnSaunders,请仔细阅读我的问题。我有一个与NullReferenceException
高度无关的特定问题。我只想知道的是一次更新多个记录。你给出的帖子没有我的解决方案。因此它不是重复的。这个例子,以及与之相关的解释,请做一些说明遗憾的是,很少有教程没有做到这一点——强调必须使用for循环(而不是foreach)并为生成的html列表中的每个元素提供一个显式索引,以便控制器正确地提取它。这真是一项伟大的工作!还值得注意的是,@html.DisplayFor不会将其值发布到控制器。您还需要使用html.HiddenFor来发布您想要发布的值,正如我提到的,此解决方案也适用于html标记另一种类型-例如
而不是tr
和
而不是td
。我在将其移植到.net core时遇到问题-有人在dotnet core下工作过吗?