2010-08-02 2 views
17

Я передаю некоторые значения моему действию контроллера, и все в порядке. В форме POST по дизайну будет отсутствовать два свойства.Обновление моей модели, а затем переоценка IsValid?

Я устанавливаю отсутствующие значения, но затем я хочу проверить модель, и она все еще говорит об ошибке, так как это выглядит так, как ModelState не догнал мои изменения.

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

Что такое чистый способ погладить ModelState по голове и сказать ему, что все будет в порядке, пока еще проверки и все остальное, что был связан с пользователем POST

ответ

33

Если недостающие значения необходимы для вашей модели, но не будет предоставлен до тех пор, пока после привязки вам может понадобиться очистить ошибки, вызванные этими двумя значениями от 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

это отвечает на вопрос. Однако я думаю, что моя архитектура - это то, что виновато. Я вернулся и изменил модель – BritishDeveloper

+0

Не похоже на решение в ASP.NET Core 1.0.0 –

4

Я использую ASP.NET Ядро 1.0.0 и асинхронное связывание и для меня решение было использовать ModelState.Remove и передать имя свойства (без имени объекта).

[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); 
} 
Смежные вопросы