2010-08-02 11 views
17

Sto passando alcuni valori all'azione del mio controller e tutto è vincolante. Ci saranno due proprietà mancanti dal modulo POST di design.Aggiornamento del mio modello quindi rivalutare IsValid?

Sto quindi impostando i valori mancanti, ma poi voglio convalidare il modello e si dice ancora falso poiché sembra che ModelState non abbia raggiunto le mie modifiche.

[HttpPost, Authorize] 
public ActionResult Thread(int id, string groupSlug, Comment comment, string submitButton) 
{ 
    comment.UserID = UserService.UID; 
    comment.IP = Request.UserHostAddress; 
    UpdateModel(comment); //throws invalidoperationexception 
    if (ModelState.IsValid) // returns false if i skip last line 
    { 
    //save and stuff 
    //redirect 
    } 
    //return view 
} 

Qual è il modo più pulito per tamponare la ModelState sulla testa e dirgli che tutto andrà bene, mentre ancora convalidare tutto ciò che era legato dal POST dell'utente

risposta

33

Se sono richiesti i valori mancanti per il tuo modello, ma non verrà fornito fino a dopo il binding, potrebbe essere necessario cancellare gli errori causati da questi due valori dallo ModelState.

[HttpPost, Authorize] 
public ActionResult Thread(int id, string groupSlug, Comment comment, string submitButton) 
{ 
    comment.UserID = UserService.UID; 
    comment.IP = Request.UserHostAddress; 

    //add these two lines 
    ModelState["comment.UserID"].Errors.Clear(); 
    ModelState["comment.IP"].Errors.Clear(); 

    UpdateModel(comment); //throws invalidoperationexception 
    if (ModelState.IsValid) // returns false if i skip last line 
    { 
    //save and stuff 
    //redirect 
    } 
    //return view 
} 
+0

Ciò risponde alla domanda. Comunque penso che la mia architettura sia ciò che è in difetto. Sono tornato indietro e ho modificato il modello – BritishDeveloper

+0

Non sembra essere la soluzione in ASP.NET Core 1.0.0 –

4

Sto utilizzando l'ASP.NET Nucleo 1.0.0 e asincrona vincolante e per me la soluzione era quella di utilizzare ModelState.Remove e passare il nome della proprietà (senza nome dell'oggetto).

[HttpPost] 
[ValidateAntiForgeryToken] 
public async Task<IActionResult> Submit([Bind("AerodromeID,ObservationTimestamp,RawObservation")] WeatherObservation weatherObservation) 
{ 
    weatherObservation.SubmitterID = this.User.FindFirst(ClaimTypes.NameIdentifier)?.Value; 
    weatherObservation.RecordTimestamp = DateTime.Now; 

    ModelState.Remove("SubmitterID"); 

    if (ModelState.IsValid) 
    { 
     _context.Add(weatherObservation); 
     await _context.SaveChangesAsync(); 
     return RedirectToAction("Index", "Aerodrome"); 
    } 
    return View(weatherObservation); 
} 
Problemi correlati