试图允许空值但是......"可以为空的对象必须有一个值"

ili*_*rvg 14 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);
    }
Run Code Online (Sandbox Code Playgroud)

Ser*_*kiy 20

在尝试获取可以为空的对象的时,您会收到此错误,该对象没有值.如果Loan.ISBNproperty不可为空,那么您应该为该属性提供默认值

ISBN = student.ISBN.HasValue ? student.ISBN.Value : defaultValue
// or ISBN = student.ISBN ?? defaultValue
// or ISBN = student.ISBN.GetValueOrDefault()
Run Code Online (Sandbox Code Playgroud)

如果Loan.ISBN属性可以为空,那么只需在student.ISBN不访问Value可空类型的情况下进行分配

ISBN = student.ISBN
Run Code Online (Sandbox Code Playgroud)


Zab*_*sky 5

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

ISBN = student.ISBN.Value
Run Code Online (Sandbox Code Playgroud)

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

ISBN = student.ISBN.GetValueOrDefault();
Run Code Online (Sandbox Code Playgroud)


Ren*_*eno 5

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

ISBN = student.ISBN ?? defaultValue;
Run Code Online (Sandbox Code Playgroud)

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