Комплексное свойство привязки модели 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}]}