Обновление моей модели, а затем переоценка IsValid? - PullRequest
26 голосов
/ 02 августа 2010

Я передаю некоторые значения своему действию контроллера, и все связывается нормально.По форме будет отсутствовать два свойства в форме 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

пользователя

Ответы [ 2 ]

39 голосов
/ 02 августа 2010

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

Я использую 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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...