试图允许null,但是…“可空”对象必须有一个值

本文关键字:对象 可空 有一个 null 但是 | 更新日期: 2023-09-27 17:49:34

我试图在我的下拉列表中允许null,在我的数据库表中,我已经设置了允许null的特定字段,这是int,但是当我运行代码时,我得到错误说"空对象必须有一个值",我认为问题可能是在ModelState。

控制器

[HttpPost]
    public ActionResult Edit(Student student)
    {
        if (ModelState.IsValid)
        {
            db.Entry(student).State = EntityState.Modified;
            db.SaveChanges();
            Loan w = new Loan()
            {
                StudentID = student.StudentID,
                ISBN = student.ISBN.Value,
            };
            db.Loans.Add(w);
            db.SaveChanges();
            return RedirectToAction("Index");
        }
        ViewBag.ISBN1 = new SelectList(db.Books, "ISBN", "Titulli", student.ISBN);
        return View(student);
    }

试图允许null,但是…“可空”对象必须有一个值

当您试图获取可空对象的值时,您将获得此错误,该对象没有值。如果Loan.ISBN属性不可为空,那么您应该为该属性提供默认值

ISBN = student.ISBN.HasValue ? student.ISBN.Value : defaultValue
// or ISBN = student.ISBN ?? defaultValue
// or ISBN = student.ISBN.GetValueOrDefault()

如果Loan.ISBN属性是可空的,那么简单地分配student.ISBN而不访问可空类型的Value

ISBN = student.ISBN

执行相同任务的最短方法,使用合并操作符,??,如下所示:

ISBN = student.ISBN ?? defaultValue;

合并运算符是这样工作的:如果第一个值(左边)为null,那么c#计算第二个表达式(右边)。

当您试图访问Nullable类型的Value属性时,当HasValue为false时,会发生此异常。请参阅MSDN上的可空类型。首先检查这一行

ISBN = student.ISBN.Value

查看ISBN是否为空。您可能想将这一行更改为

ISBN = student.ISBN.GetValueOrDefault();

我有一个对象的列表与双精度?属性。在接收到控制器的请求后,我无法将列表发送到服务类,并且我得到错误System。InvalidOperationException: '可空对象必须有一个值。'。我将空值更改为999999999(默认值),并且在服务方法中忽略999999999值并将它们插入数据库。

    [HttpPost]
    [Route("api/TestReader/UpdateStudentsGradeFromExcel")]
    public IHttpActionResult UpdateStudentsGradeFromExcel(List<TestReaderStudentsVM> model)
    {
        foreach (var item in model)
        {
            if (item.Grade == null)
                item.Grade = 999999999;
        }
        tblTestReaderManager.UpdateStudentsGradeFromExcel(model);
        return Ok();
    }

In service method:

foreach (var item in model.Where(m => m.Grade != 999999999))
{
   // insert model items to the db
}