Обновление моей модели, а затем переоценку IsValid?
Я передаю некоторые значения моему действию контроллера, и все в порядке. В форме POST по дизайну будет отсутствовать два свойства.
Затем я устанавливаю отсутствующие значения, но затем я хочу проверить модель, и она по-прежнему говорит false, поскольку она выглядит так, как 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
Ответы
Ответ 1
Если требуемые значения требуются для вашей модели, но не будут предоставлены до тех пор, пока после привязки вам может понадобиться очистить ошибки, вызванные этими двумя значениями из 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
}
Ответ 2
Я использую ASP.NET Core 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);
}