Ручной вызов проверки состояния модели завершается неудачно во вложенных классах - PullRequest
0 голосов
/ 15 марта 2019

Итак, у меня есть класс

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.

1 Ответ

0 голосов
/ 15 марта 2019

если вы действительно хотите этот дизайн, тогда вам нужно

  1. в вашем клиенте вы должны передать его как текст / обычный текст. Пример:

POST / api / values? CorrelationId = 123 HTTP / 1.1 Хост: localhost: 5551 Content-Type: text / plain cache-control: no-cache Почтовый токен: b766b3d6-9478-43b1-b49c-2677e0b08dec {"маршрутизация": {"senderId": «123», «receiveId»: «456», «partnerId»: «777», «messageType»: "888"}, "items": []}

  1. в вашем ядре asp.net вам нужно принять текст / обычный

    открытый класс TextPlainInputFormatter: TextInputFormatter { public TextPlainInputFormatter () { SupportedMediaTypes.Add ( "текст / обычный"); SupportedEncodings.Add (UTF8EncodingWithoutBOM); }

    protected override bool CanReadType(Type type)
    {
        return type == typeof(string);
    }
    
    public override async Task<InputFormatterResult> ReadRequestBodyAsync(InputFormatterContext context, Encoding encoding)
    {
        string data = null;
        using (var streamReader = context.ReaderFactory(context.HttpContext.Request.Body, encoding))
        {
            data = await streamReader.ReadToEndAsync();
        }
        return InputFormatterResult.Success(data);
    }
    

    }

  2. добавить TextPlainInputFormatter:

    services.AddMvc (options => {options.InputFormatters.Add (new TextPlainInputFormatter ());});

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...