首页 > 解决方案 > 如何从列表和批量更新数据库中捕获数据?

问题描述

我希望能够批量更新我的数据库中的数据。我可以将数据显示为列表,但检索数据以更新数据库会导致此错误:

System.NullReferenceException:“对象引用未设置为对象的实例。”

我的代码如下:我的控制器

public ActionResult UpdateRecords(int? id)
{
    if (id == null)
    {
        return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
    }

    var view = from m in db.Tbl_Marks
                  join c in db.Tbl_Child on m.ChildID equals c.ChildID
                  where m.AID == id 
                  select new Assessments { Child=c, Marks=m};

    return View(view.ToList());
}

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult UpdateRecords(IEnumerable<Assessments> tbm )
{
    if (ModelState.IsValid)
    {       
        foreach(Assessments i in tbm)
        {
            Tbl_Marks m = new Tbl_Marks();
            m.AID = i.Marks.AID;
            m.MID = i.Marks.MID;
            m.MarkAchieved = i.Marks.MarkAchieved;
            m.ChildID = i.Marks.ChildID;
            db.Entry(m).State = System.Data.Entity.EntityState.Modified;
        }
        db.SaveChanges();        

        return RedirectToAction("Assessments");
    }
    return View("Assessments");
}

我的观点

@model IEnumerable<CEDAR.Assessments>


<h2>Marks</h2>
<table class="table">
    <tr>
        <th>
            @Html.DisplayNameFor(model => model.Child.ChildID)
        </th>

        <th>
            @Html.DisplayNameFor(model => model.Child.Name)
        </th>

        <th>
            @Html.DisplayNameFor(model => model.Child.Surname)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.Marks.MarkAchieved)
        </th>

        <th></th>
    </tr>
    @using (Html.BeginForm("UpdateRecords", "Admin"))
    {
        @Html.AntiForgeryToken()

        foreach (var item in Model)
        {
            @Html.HiddenFor(modelItem => item.Marks.MID)
            @Html.HiddenFor(modelItem => item.Marks.AID)
            @Html.HiddenFor(modelItem => item.Marks.ChildID)
            @Html.HiddenFor(modelItem => item.Child.Surname)
            @Html.HiddenFor(modelItem => item.Child.Grade)
            @Html.HiddenFor(modelItem => item.Child.Disabilities)
            @Html.HiddenFor(modelItem => item.Child.ParentID)
            @Html.HiddenFor(modelItem => item.Child.Enrolled)
            <tr>
                <td>
                    @Html.DisplayFor(modelItem => item.Child.ChildID)
                </td>

                <td>
                    @Html.DisplayFor(modelItem => item.Child.Name)
                </td>

                <td>
                    @Html.DisplayFor(modelItem => item.Child.Surname)
                </td>
                <td>
                    @Html.EditorFor(modelItem => item.Marks.MarkAchieved, new { htmlAttributes = new { @class = "form-control" } })
                    @Html.ValidationMessageFor(modelItem => item.Marks.MarkAchieved, "", new { @class = "text-danger" })

                </td>
            </tr>
        }

        <div class="form-group">
            <div class="col-md-offset-2 col-md-10">
                <input type="submit" value="Save" class="btn btn-primary" />
                <input type="button" value="Cancle" onclick="goBack()" class="btn btn-danger" />
            </div>
        </div>

    }
</table>

我的模特

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace CEDAR
{
    public class Assessments
    {        
        public Tbl_Marks Marks { get; set; }
        public Tbl_Child Child { get; set; }
    }
}

我从两个表中获取数据并将其合并以显示为一个视图。我应该能够从列表中更新 MarksAchieved 字段,然后单击保存。然后它将通过数据库并更新列表中每个项目的所有 MarksAchieved 字段。

标签: c#asp.net-mvcentity-frameworkviewmodel

解决方案


推荐阅读