Передача сложного фильтра HttpApi в Asp. Net Core 3.1 - PullRequest
2 голосов
/ 06 мая 2020

Я создал Asp. Net Core Controller, и я хотел бы передать Data, бросив URL-адрес на мой Backend.

Вставьте мой URI, который я хотел бы вставить: filter: "[ [{"field": "firstName", "operator": "eq", "value": "Jan"}]]

Итак, мой URI выглядит так: https://localhost: 5001 / Patient ? filter =% 5B% 5B% 7B% 22field% 22% 3A% 22firstName% 22,% 22operator% 22% 3A% 22eq% 22,% 22value% 22% 3A% 22Jan% 22% 7D% 5D% 5D

и мой контроллер:

[HttpGet]
public ActionResult<bool> Get(
    [FromQuery] List<List<FilterObject>> filter = null)
{
            return true;
}

и мой FilterObject выглядит так:

public class FilterObject
    {
        public string Field { get; set; }
        public string Value { get; set; }
        public FilterOperator Operator { get; set; } = FilterOperator.Eq;

    }

Проблема в том, что мои данные из URL-адреса не десериализованы в моем фильтре Параметр.

Есть ли у кого-нибудь идея? За помощь.

С уважением

1 Ответ

1 голос
/ 07 мая 2020

Бросьте мой URI, который я хотел бы вставить: filter: "[[{" field ":" firstName "," operator ":" eq "," value ":" Jan "}]]

Вы можете выполнить требование, реализовав привязку пользовательской модели, следующий фрагмент кода приведен для справки.

public class CustomModelBinder : IModelBinder
{
    public Task BindModelAsync(ModelBindingContext bindingContext)
    {
        if (bindingContext == null)
        {
            throw new ArgumentNullException(nameof(bindingContext));
        }

        // ...
        // implement it based on your actual requirement
        // code logic here
        // ...

        var options = new JsonSerializerOptions
        {
            PropertyNameCaseInsensitive = true
        };
        options.Converters.Add(new JsonStringEnumConverter(JsonNamingPolicy.CamelCase));

        var model = JsonSerializer.Deserialize<List<List<FilterObject>>>(bindingContext.ValueProvider.GetValue("filter").FirstOrDefault(), options);

        bindingContext.Result = ModelBindingResult.Success(model);
        return Task.CompletedTask;
    }
}

Действие контроллера

[HttpGet]
public ActionResult<bool> Get([FromQuery][ModelBinder(BinderType = typeof(CustomModelBinder))]List<List<FilterObject>> filter = null)
{

Результат теста

enter image description here

...