2012-12-27 8 views
11

Próbuję zezwolić na wartości null na mojej rozwijanej liście, w mojej tabeli bazy danych ustawiłem allow nulls dla tego konkretnego pola, które jest int, ale kiedy Uruchomiłem kod, który dostaję błąd mówiąc "obiekt zerowy musi mieć wartość", myślę, że problem może być w ModelState.Próba zezwolenia na wartości null, ale ... "Obiekt zerowy musi mieć wartość"

Controller

[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

Czy właściwość 'ISBN' klasy' Loan' jest zerowa? –

+0

* Który * obiekt zerowy powinien mieć wartość? Kiedy "ModelState" jest uważane za poprawne? W którym wierszu kodu pojawia się ten błąd? –

+0

Tak, jest, ale teraz w pierwszym momencie dostaję ten błąd, ale jeśli wrócę i zobaczę listę, to zmiany są zapisywane i nie teraz, co teraz się dzieje – ilirvg

Odpowiedz

18

Otrzymujesz ten błąd podczas próby get value of nullable obiektu, które nie mają wartości. Jeśli Loan.ISBN nieruchomość nie jest pustych wówczas należy podać wartość domyślną dla tej nieruchomości

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

jeśli Loan.ISBN nieruchomość jest pustych, a potem po prostu przypisać student.ISBN bez dostępu Value od wartości pustych typu

ISBN = student.ISBN 
+0

Jeśli ustawisz właściwość 'Value' na' null', to dlaczego "HasValue" nie jest prawdziwe? Wygląda na to, że ponieważ została jawnie ustawiona, ma wartość, która ma wartość 'null'. – toddmo

+0

@toddmo [HasValue] (https://msdn.microsoft.com/en-us/library/sksw8094 (v = vs.110) .aspx) wskazuje, czy obiekt z wartością NULL ma poprawną wartość * typu bazowego *. 'null' nie jest prawidłową wartością dla' struct', więc 'HasValue' według jej intencji powinno zwracać fałsz. Należy również pamiętać, że 'Wartość' ma typ' T', który jest 'struct' (ponownie, nie można przypisać wartości null do typu), a nawet więcej -" Wartość "jest własnością tylko do odczytu. –

4

Wyjątek ten występuje wtedy, gdy spróbuj uzyskać dostęp do właściwości Value typu Nullable, gdy HasValue ma wartość false. Zobacz Nullable Types na MSDN. Więc przede wszystkim sprawdzić tę linię

ISBN = student.ISBN.Value 

aby zobaczyć czy ISBN nie jest null. Możesz zmienić tę linię do

ISBN = student.ISBN.GetValueOrDefault(); 
2

najkrótsza droga do wykonania tego samego zadania, za pomocą operatora zlewają, ??, pokazany poniżej:

ISBN = student.ISBN ?? defaultValue; 

Operator COALESCE działa tak: jeżeli pierwsza wartość (po lewej stronie) ma wartość null, następnie C# analizuje drugie wyrażenie (po prawej stronie).

Powiązane problemy