3

I would like to validate list of models one by one programmatically.

I tried TryValidateModel but looks like it aggregates validation errors, so that when I iterate through the list of 10 models, if 5th model is not valid, for models 6-10 TryValidateModel returns false.

Andrei
  • 42,814
  • 35
  • 154
  • 218

1 Answers1

3

You can use controller methods ValidateModel or TryValidateModel.

ValidateModel - throws exception if model is not valid.

TryValidateModel - returns bool which indicates if model is valid.

From MSDN:

When a model is being validated, all validators for all properties are run if at least one form input is bound to a model property. The TryValidateModel is like the ValidateModel method except that the TryValidateModel method does not throw an InvalidOperationExceptionexception if the model validation fails.

If you validate list of models one by one, you probably would like to reset ModelState for each iteration by calling ModelState.Clear().

Andrei
  • 42,814
  • 35
  • 154
  • 218
  • Can this be done without the model having been populated by a view? In other words your model object is populated in some other way. – Matthew Sep 14 '14 at 16:49
  • 1
    @Matt yes, you can pass any model you wish into these methods – Andrei Sep 15 '14 at 07:24
  • Unfortunately this doesn't work for me - I can call for(var o in viewModels) ..., ModelState.Clear() in each iteration, TryValidateObject(o, validation, validateResults), and so long as the first object is valid every single object after will pass as valid, even when I know for certain they're invalid. – Chris Moschini Jun 28 '18 at 15:20