Я хочу иметь возможность пакетного обновления данных в моей базе данных. Я могу отображать данные в виде списка, но получение данных для обновления БД приводит к этой ошибке:
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; }
}
}
Я беру данные из двух таблиц иобъединяя его, чтобы отобразить как один вид. Я должен быть в состоянии обновить поля MarksAchieve из списка и затем нажать «Сохранить». Затем он будет проходить через базу данных и обновлять все поля MarksAchieveed для каждого элемента в списке.