Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在asp.net mvc中一次更新多个记录_C#_Asp.net_Asp.net Mvc - Fatal编程技术网

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下工作过吗?