2012-12-27 19 views
11

Sto tentando di consentire i valori nulli nell'elenco a discesa, nella tabella del mio database ho impostato i valori nulli per quel campo specifico che è int, ma quando Corro il codice ottengo errore dicendo "L'oggetto Nullable deve avere un valore", penso che il problema potrebbe essere in ModelState.Cercando di consentire i valori nulli ma ... "L'oggetto Nullable deve avere un valore"

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

La proprietà 'ISBN' della classe' Loan' non è valida? –

+0

* Quale * oggetto nullable dovrebbe avere un valore? Quando è considerato "ModelState" valido? A quale riga del codice ottieni questo errore? –

+0

sì, ma ora la prima volta ottengo quell'errore, ma se torno indietro e vedo la lista le modifiche sono state salvate ora non so cosa sta succedendo ora – ilirvg

risposta

18

hai trovato questo errore quando si cerca di get value of nullable oggetto, che non hanno valore. Se Loan.ISBN proprietà non è annullabile, allora si dovrebbe fornire un valore di default per quella proprietà

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

Se Loan.ISBN proprietà è annullabile, allora semplicemente assegnare student.ISBN senza accedere Value di tipo nullable

ISBN = student.ISBN 
+0

Se si imposta la proprietà 'Value' su' null', allora perché "HasValue" non è vero? Sembra che, poiché è stato impostato in modo esplicito, ha un valore e tale valore è 'null'. – toddmo

+0

@toddmo [HasValue] (https://msdn.microsoft.com/en-us/library/sksw8094 (v = vs.110) .aspx) indica se l'oggetto nullable ha un valore valido del proprio * tipo sottostante *. 'null' non è un valore valido per' struct' quindi, 'HasValue' dal suo intento dovrebbe restituire false. Ricorda inoltre che 'Value' ha tipo' T' che è 'struct' (di nuovo, non puoi assegnare un tipo nullo a valore) e ancora di più -' Value' è una proprietà di sola lettura. –

4

Questa eccezione si verifica quando si prova ad accedere alla proprietà Value del tipo Nullable quando HasValue è falso. Vedere Nullable Types su MSDN. Quindi prima di tutto verificare questa linea

ISBN = student.ISBN.Value 

per vedere se ISBN non è nullo. Si consiglia di modificare questa linea per

ISBN = student.ISBN.GetValueOrDefault(); 
2

La via più breve per eseguire lo stesso compito, utilizzando l'operatore si fondono, ??, illustrato di seguito:

ISBN = student.ISBN ?? defaultValue; 

L'operatore si fondono funziona così: se il primo valore (lato sinistro) è nullo, quindi C# valuta la seconda espressione (lato destro).

Problemi correlati