Di aggiornare il mio modello poi ri-valutare IsValid?

Sto passando alcuni valori per il mio controller azione e tutto ciò che è vincolante fino fine. Ci saranno due proprietà mancante dal modulo POST by design.

Sono quindi impostando i valori mancanti ma poi voglio convalidare il modello ed è ancora dicendo falso, dal momento che sembra che il ModelState non ha interferito con 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 di pat il ModelState sulla testa e dire che tutto andrà bene, mentre ancora la convalida di tutto il resto che è stato associato all’utente POST di

 

2 Replies
  1. 39

    Se i Valori mancanti sono necessari per il tuo modello, ma non sarà fornito fino a dopo il binding, potrebbe essere necessario cancellare gli errori causati da questi due valori, dal 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
    }
    • questo risponde alla domanda. Tuttavia penso che la mia architettura è ciò che è in difetto. Sono andato indietro e cambiato il modello
    • Non sembra essere la soluzione ASP.NET Core 1.0.0
  2. 6

    Sto usando il ASP.NET Core 1.0.0 e async associazione e per me la soluzione era quella di utilizzare ModelState.Rimuovere e passare la proprietà del nome (senza il 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);
    }

Lascia un commento