2012-12-27 40 views
11

Tôi đang cố gắng cho phép null trong danh sách thả xuống của mình, trong bảng cơ sở dữ liệu của tôi mà tôi đã đặt cho phép cho trường cụ thể đó là int, nhưng khi Tôi chạy mã tôi nhận được lỗi nói rằng "đối tượng Nullable phải có một giá trị", tôi nghĩ rằng vấn đề có thể được trong ModelState.Đang cố gắng cho phép null nhưng ... "Đối tượng dễ vỡ phải có giá trị"

khiển

[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); 
    } 
+0

Thuộc tính 'ISBN' của lớp 'Loan' có thể vô hiệu hóa không? –

+0

* Đối tượng nào có thể null có giá trị? Khi nào 'ModelState' được coi là hợp lệ? Tại dòng nào trong mã bạn nhận được lỗi đó? –

+0

vâng, nhưng bây giờ trong lần đầu tiên tôi nhận được lỗi đó nhưng nếu tôi quay lại và xem danh sách các thay đổi được lưu i dont bây giờ những gì đang xảy ra – ilirvg

Trả lời

18

Bạn đang nhận được lỗi này khi cố gắng get value of nullable đối tượng, trong đó không có giá trị. Nếu Loan.ISBN tài sản là không nullable thì bạn nên cung cấp giá trị mặc định cho tài sản đó

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

Nếu Loan.ISBN tài sản là nullable, sau đó chỉ cần gán student.ISBN mà không cần truy cập vào Value loại nullable

ISBN = student.ISBN 
+0

Nếu bạn đặt thuộc tính 'Value' thành' null', thì tại sao không phải là 'HasValue' đúng? Có vẻ như, vì nó được thiết lập rõ ràng, nó có một giá trị và giá trị đó là 'null'. – toddmo

+0

@toddmo [HasValue] (https://msdn.microsoft.com/en-us/library/sksw8094 (v = vs.110) .aspx) cho biết đối tượng nullable có giá trị hợp lệ của * kiểu cơ bản * của nó không. 'null' không phải là giá trị hợp lệ cho' struct' như vậy, 'HasValue' theo ý định của nó sẽ trả về false. Cũng nên nhớ rằng 'Giá trị' có kiểu' T' là 'struct' (một lần nữa, bạn không thể gán giá trị null cho giá trị) và thậm chí nhiều hơn -' Giá trị' là thuộc tính chỉ đọc. –

4

ngoại lệ này xảy ra khi bạn cố gắng truy cập vào thuộc tính Value của Nullable nhập khi HasValue là sai. Xem Nullable Types trên MSDN. Vì vậy, trước hết hãy kiểm tra dòng này

ISBN = student.ISBN.Value 

để xem liệu ISBN không phải là không. Bạn có thể muốn thay đổi dòng này để

ISBN = student.ISBN.GetValueOrDefault(); 
2

Con đường ngắn nhất để thực hiện các nhiệm vụ tương tự, sử dụng toán tử liên hiệp, ??, hiển thị bên dưới:

ISBN = student.ISBN ?? defaultValue; 

Nhà điều hành liên hiệp các công trình như thế này: nếu giá trị đầu tiên (bên tay trái) là null, sau đó C# đánh giá biểu thức thứ hai (bên phải).

Các vấn đề liên quan