Итак, у меня есть класс
public class Inventory
{
[Required]
public Routing Routing { get; set; }
[Required]
public List<Items> Items { get; set; }
}
И, Маршрутизация и Предметы - это отдельные классы с собственными параметрами проверки.
public class Routing
{
[Required]
public string SenderId { get; set; }
[Required]
public string ReceiverId { get; set; }
public string PartnerId { get; set; }
[Required]
public string MessageType { get; set; }
}
Теперь я использовал проверку модели в веб-API, она работала просто отлично.
public async Task<IActionResult> Post([FromBody] Inventory request, [FromQuery(Name = "CorrelationId")] string correlationId)
{
....
// Working just fine, validating the incoming request schema as defined by Inventory class
}
Если пользователь / потребитель отправляет запрос POST с неверной схемой, он терпит неудачу на уровне HTTP и показывает запрос 400 BAD, а элемент управления даже не входит в тело метода Post
.Я хочу, чтобы элемент управления входил в метод Post
.
Теперь я выполняю ручную проверку
public async Task<IActionResult> Post([FromBody] string request, [FromQuery(Name = "CorrelationId")] string correlationId)
{
Inventory obj = JsonConvert.DeserializeObject<Inventory>(request);
var context = new ValidationContext(obj, serviceProvider: null, items: null);
var validationResults = new List<ValidationResult>();
bool isValid = Validator.TryValidateObject(obj, context, validationResults);
if (!isValid)
{
// Valid even if I omit some parameters of nested classes Routing or Items
foreach (var validationResult in validationResults)
{
Console.WriteLine(validationResult.ErrorMessage);
}
}
}
Теперь, если я, скажем, пропущу SenderId
из Routing
класс, он показывает Действительный в приведенной выше ручной проверке.
Что я хочу: - Проверка схемы / модели в методе Post
и, если он недействителен, список всех ошибок в методе Post
.