试图允许空值但是......" Nullable对象必须有一个值"

时间:2012-12-27 10:55:13

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

我试图在我的下拉列表中允许空值,在我的数据库表中,我为该特定字段设置了允许空值,但是当我运行代码时,我得到错误,说“可以为空的对象必须有值” ,我认为问题可能出在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);
    }

3 个答案:

答案 0 :(得分:20)

尝试get value of nullable对象时遇到此错误,该对象没有值。如果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

答案 1 :(得分:5)

执行相同任务的最短路径,使用coalesce运算符,??,如下所示:

ISBN = student.ISBN ?? defaultValue;

coalesce运算符的工作方式如下:如果第一个值(左侧)为null,则C#计算第二个表达式(右侧)。

答案 2 :(得分:4)

Value为false时,如果您尝试访问Nullable类型的HasValue属性,则会发生此异常。请参阅MSDN上的Nullable Types。所以首先检查这一行

ISBN = student.ISBN.Value

查看ISBN是否为空。您可能希望将此行更改为

ISBN = student.ISBN.GetValueOrDefault();