Итак, я создаю API в .NET core 2.1 и хотел бы проверить модель, прежде чем она будет обновлена.Поэтому я решил внедрить IValidatableObject
, который очень хорошо работает для простых моделей.
Однако теперь я хочу проверить формат запроса, отправленного мне разработчиком;то есть я хочу, чтобы мой валидатор не только проверял метод Validate
, но и ловил ValidationResult
объекты, которые могли быть получены в других местах объекта.
Мои классы:
public class Dad : IValidatableObject
{
public long Id { get; set; }
[Required]
public Kid Kid { get; set; }
public IEnumerable<ValidationResult> UpdateProperties(JObject props)
{
if (props["Kid"]["Id"] == null)
yield return new ValidationResult("The correct format to set the Kid of Dad is {\"Kid\":{\"Id\":100}}");
}
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{
if (Kid.Height <= 170)
yield return new ValidationResult("Kids need to be taller than 170.")
}
}
public class Kid
{
public long Id { get; set; }
public int Height { get; set; } = 180;
}
Мой контроллер:
[HttpPatch("{id}")]
public async Task<IActionResult> PatchDad([FromRoute] long id, [FromBody] JObject props)
{
Dad dad = _context.Dads.Find(id);
dad.UpdateProperties(props);
List<ValidationResult> Errors = new List<ValidationResult>();
bool IsValid = Validator.TryValidateObject(dad, new ValidationContext(dad, serviceProvider: null, items: null), Errors);
// I need the Validator to catch errors that occur in the Dad.UpdateProperties field !
if (!IsValid)
return BadRequestObjectResult(Errors);
return NoContent();
}
Отправка запроса PUT /Dad/19
с необработанными данными: {"KidId":100}
должно привести к двум ошибкам;первый говорит, что формат параметра неверен, второй говорит, что требуется Kid
.