FluentValidation выполняет проверку в неподходящее время

#asp.net-mvc #fluentvalidation

#asp.net-mvc #fluentvalidation

Вопрос:

У меня есть настройка FluentValidation на моем веб-сайте MVC. У одного из моих объектов есть проверка проверки, которая использует команду Must для вызова функции:

 RuleFor(m => m).Must(m => reimbursementMonthsRequired(m)).WithMessage("Wrong!").WithName("ReimbursementStartMonth");
  

Функция repensementmonthsrequired проверяет значение объекта и коллекцию под объектом для определения достоверности.

У меня есть метод Post, который принимает список значений, который используется для обновления этой коллекции:

 [HttpPost]
public ActionResult AddGrant(Grant item, List<byte> reimbursementMonths)
{
  item.UpdateReimbusementMonths(Database, reimbursementMonths);
  if (ModelState.IsValid)
  {     
    Database.Grants.Add(item);
    Database.SaveChanges();
    ...
  

Проблема, с которой я сталкиваюсь, заключается в том, что в этой функции проверка проверки вызывается перед вызовом UpdateReimbusementMonths. Итак, данных, которые мне нужны для правильной проверки проверки, еще нет. Странно то, что в моей функции редактирования проверка происходит после того, как я вызываю UpdateReimbursementMonths, поэтому она работает правильно. Это то, что это делает:

 [HttpPost]
public ActionResult EditGrant(int id, List<byte> reimbursementMonths)
{
  var item = Database.Grants.Find(id);
  item.UpdateReimbusementMonths(Database, reimbursementMonths);
  TryUpdateModel(item);
  if (ModelState.IsValid)
  ... 
  

Итак, как мне заставить мою функцию Add выполнять проверку в нужное время после вызова функции для обновления коллекции? Кажется, что если бы я мог повторно запустить проверки проверки после этого вызова функции, это сработало бы.

Комментарии:

1. упомянутая вами проверка, это для объекта Grant?

2. Не лучшее решение … но как насчет того, чтобы удалить ключ из ModelState (используя ModelState. Удалить) перед ModelState. isValid? Затем вы можете добавить свои гранты и добавить ключ обратно в ModelState и снова проверить его.

Ответ №1:

Он работает в соответствии с документацией

В методе AddGrant вы публикуете объект Grant, поэтому он выполняет проверку после автоматической привязки, прежде чем выполнить какой-либо код в вашем методе действия.

-> Вам либо нужно обновить Grant с возмещениями перед публикацией, либо удалить fluent validation и выполнить эту проверку вручную в методе action.

-> Другой вариант — написать пользовательский элемент гранта Validator Interceptors и обновить его с возмещением в BeforeMvcValidation методе. (это может быть взломом и не идеально для выполнения)

Ответ №2:

Я обнаружил, что работает, чтобы метод AddGrant выполнял что-то похожее на EditGrant. Вместо того, чтобы принимать объект Grant в качестве параметра метода, я сделал это:

 public ActionResult AddGrant(List<byte> reimbursementMonths)
{      
  var item = new Grant();
  item.UpdateReimbusementMonths(Database, reimbursementMonths);
  TryUpdateModel(item);

  if (ModelState.IsValid)
  {     
    ...
  

К счастью, я не использую никаких значений из объекта Grant в методе UpdateReimbusementMonths. Если бы я это сделал, мне пришлось бы придумать что-то еще, потому что, по-видимому, TryUpdateModel запускает процесс проверки.