2010-08-02 5 views
17

Podaję niektóre wartości do mojej akcji kontrolera i wszystko jest w porządku. Nie będzie dwóch właściwości brakujących w formularzu POST według projektu.Aktualizowanie mojego modelu, a następnie ponowne oszacowanie IsValid?

Ustawiam następnie brakujące wartości, ale chcę sprawdzić poprawność modelu i nadal wypowiada się fałszywie, ponieważ wygląda na to, że ModelState nie nadrobił moich zmian.

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

Jaki jest najczystszym sposobem pat ModelState na głowie i powiedzieć jej, że wszystko będzie w porządku, podczas gdy nadal sprawdzania wszystkiego innego, który był związany z użytkownika POST

Odpowiedz

33

Jeśli brakujących wartości są wymagane Twój model, ale nie zostanie dostarczony, dopóki nie będziesz musiał usunąć błędów spowodowanych przez te dwie wartości z 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

to odpowiada na pytanie. Jednak myślę, że moja architektura jest winna. Wróciłem i zmieniłem model – BritishDeveloper

+0

Nie wydaje się być rozwiązaniem w ASP.NET Core 1.0.0 –

4

Używam ASP.NET Rdzeń 1.0.0 i asynchroniczny wiążące i dla mnie rozwiązaniem było użycie ModelState.Remove i przekazać nazwę właściwości (bez nazwy obiektu).

[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); 
} 
Powiązane problemy