在asp.net mvc中一次更新多个记录

时间:2015-05-22 16:17:43

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

我正在尝试使用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的所有输入?

1 个答案:

答案 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无效的视图,以便用户可以更正任何错误。