Подтвердить что ты не робот

Обновление моей модели, а затем переоценку 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

4b9b3361

Ответ 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);
}