Как передать тип «System.Object» в контроллер через параметр FromQuery - PullRequest
0 голосов
/ 28 апреля 2020

У меня есть этот метод в моем контроллере, который должен получить список фильтрующих выражений, поэтому я могу фильтровать таблицу DynamoDB, но значение для фильтрации может быть строковым, числовым c, логическим, и т. Д. c ... поэтому я использовал типизированное свойство System.Object. Но кажется, что контроллер не может связать параметр FromQuery с объектом типа «System.Object».

        [HttpGet]
        public IActionResult Get(
            [FromRoute]string name,
            [FromQuery]FilterExpression[] filters
            )
        {
            return Ok(m_attributeService.GetByAttributeName(name, filters));
        }

Класс FilterExpression

    public class FilterExpression
    {
        public FilterExpression(){}
        public FilterExpression(
            string field, 
            string comparisonOperator, 
            dynamic values
            )
        {
            Field = field;
            ComparisonOperator = comparisonOperator;
            Values = values;
        }

        public string Field { get;set; }
        public string ComparisonOperator { get;set; }
        public object Values { get;set; }
    }

Но каждый раз, когда я делаю любой запрос, свойство Values ​​всегда null . Я хочу найти обходное решение для получения разных типов данных по моему методу.

Ответы [ 2 ]

0 голосов
/ 28 апреля 2020

Вы можете привязать к чему угодно. Однако средство связывания моделей должно проверять тип, чтобы определить, с какими свойствами оно может связываться, и затем соответствующим образом связывать данные из запроса. Object не имеет свойств, и, таким образом, связыватель моделей ничего с ним не связывает. Я полагаю, что вы пытаетесь полиморфно связать, но это не так, как работает привязка модели. Хотя действия являются технически методами, они не функционируют как обычный метод, потому что они динамически вызываются. Когда вы, как разработчик, передаете какой-либо объект, передавая его в метод, у вас все еще есть полный объект, и поэтому вы всегда можете уменьшить его до его типа позже. В конвейере запросов у связывателя модели просто есть пары ключ-значение строки коллекции, которые он пытается интерпретировать как некоторый тип. Он должен знать, какой тип создать из параметра действия, поэтому, если вы используете базовый тип, все, что вы получите, это базовый тип. Все посторонние данные будут отброшены.

0 голосов
/ 28 апреля 2020

Я думаю, что пользовательское связующее может помочь вам. Подробнее см. В документации MSDN

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