2010-08-02 12 views
17

Estoy pasando algunos valores a la acción de mi controlador y todo está vinculando muy bien. Habrá dos propiedades que faltan en el formulario POST por diseño.¿Actualizar mi modelo y luego volver a evaluar IsValid?

Estoy configurando los valores que faltan pero luego quiero validar el modelo y sigue diciendo que es falso, ya que parece que el modelo no ha alcanzado mis cambios.

[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 
} 

¿Cuál es la manera más limpia para acariciar el ModelState en la cabeza y decirle que todo estará bien, mientras que todavía validar todo lo que estaba obligado a partir de correos del usuario

Respuesta

33

Si se requieren los valores perdidos para su modelo, pero no se proporcionará hasta después del enlace, es posible que necesite borrar los errores causados ​​por esos dos valores del 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

esto responde la pregunta. Sin embargo, creo que mi arquitectura es la culpable. He retrocedido y cambiado el modelo – BritishDeveloper

+0

No parece ser la solución en ASP.NET Core 1.0.0 –

4

estoy usando ASP.NET el núcleo 1.0.0 y asíncrono vinculante y para mí la solución era utilizar ModelState.Remove y pasar el nombre de la propiedad (sin nombre del objeto).

[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); 
} 
Cuestiones relacionadas