В моем контроллере API у меня есть следующий код
public class RunReportController : System.Web.Http.ApiController
{
[HttpPost]
public IHttpActionResult Post([FromUri]string reportname, [FromBody]IsoDate date)
{
// the code here is running but the IsoDate is never set correctly
// reportname is working ok and set to correct values
}
}
Дата Iso объявлена следующим образом:
public class IsoDate
{
int Year { get; set; }
int Month { get; set; }
int Day { get; set; }
public IsoDate()
{
}
}
И вот как я называю это со страницы:
$.ajax({
type: "POST",
url: "/api/admin/report/some-report",
data: JSON.stringify({Year:2019,Month:1,Day:1}),
contentType : 'application/json'
}).success(()=>{console.log("ok")}).fail(()=>{console.log("bad")});
И вот как объявляется маршрут:
config.Routes.MapHttpRoute(name: "RunReport", routeTemplate: "api/Admin/Report/{reportname}", defaults: new { controller = "RunReport" });
Каким-то образом IsoDate никогда не присваивается никаких значений и всегда хранит 3 нуля. Я знаю, что мог бы поместить дату в URI, но мне понадобятся другие отчеты, которые будут принимать более сложные данные (конечно, с использованием другого маршрута). Мне нужны мои контроллеры, чтобы принимать объекты из тела.
Еще один вывод: если я заменил тип параметра date
на Dictionary<string,int>
, он сразу начнет работать.