Комплексное свойство привязки модели C#

В моем REST API привязка модели не отображает свойство, которое является списком объектов. Он правильно попадает в контроллер и показывает все свойства, но они пусты.

Например, для запроса POST {age: 202, setting: ["school"]} В ответ я получаю примерно следующее:

      Got param type=SearchStringDTO; param={"age":202,"setting":[]}

Я хочу, чтобы он ответил примерно так:

      Got param type=SearchStringDTO; param={"age":202,"setting":["school":true, "hospital":false]}

Как я могу помочь ему разобрать параметр настройки в List<Setting> ?

Вот контроллер:

      using System.Web.Http;
...
        [HttpPost]
        public HttpResponseMessage Index(SearchStringDTO param) {
            return ResponseMessage(this.Request.CreateErrorResponse(HttpStatusCode.InternalServerError, "Got param type= " + param.GetType() + "; param = " + JsonConvert.SerializeObject(param)));

        }

Вот модель:

          public sealed class SearchStringDTO {
        public int age { get; set; }

        public List<Setting> setting { get; set; }
    }

Вот класс настройки:

          public class Setting {
        public bool hospital { get; set; }
        public bool school { get; set; }
    }

Я начал этот путь, чтобы разбирать вещи вручную, но это кошмар JObject, JToken, JArray.

              [HttpPost]
        public IHttpActionResult Index(Newtonsoft.Json.Linq.JObject param) {
            return ResponseMessage(this.Request.CreateErrorResponse(HttpStatusCode.InternalServerError, "Got param type= " + param.GetType() + "; param = " + JsonConvert.SerializeObject(param)));
        }

Может мне нужна кастомная модель привязки? Я заблудился, пытаясь понять, как его построить и использовать.

1 ответ

Решение

Ваш код в порядке, но ваш входной параметр json имеет неправильный формат. Я тестировал

      [HttpPost]
public string Index( [FromBody] SearchStringDTO param)
{
return "Got param type= " + param.GetType()
 + "; param = " + JsonConvert.SerializeObject(param);
}

в почтальоне с использованием:

       {age: 202, setting: [{"school":false, "hospital":true},{"school":true, "hospital":false}]}

и получил вывод:

      Got param type= SearchStringDTO; param = {"age":202,"setting":[{"hospital":true,"school":false},{"hospital":false,"school":true}]}
Другие вопросы по тегам