如何将DateTime值发布到Web API 2控制器

Pie*_*tje 6 asp.net asp.net-mvc json fiddler asp.net-web-api

我有一个示例控制器:

[RoutePrefix("api/Example")]
public class ExampleController : ApiController
{
    [Route("Foo")]
    [HttpGet]
    public string Foo([FromUri] string startDate)
    {
        return "This is working";
    }

    [Route("Bar")]
    [HttpPost]
    public string Bar([FromBody] DateTime startDate)
    {
        return "This is not working";
    }
}
Run Code Online (Sandbox Code Playgroud)

当我发出GET请求时:http://localhost:53456/api/Example/Foo?startDate=2016-01-01它有效.

当我POST到http://localhost:53456/api/Example/Bar我收到HTTP/1.1 400 Bad Request错误.

这是我的POST数据:

{
"startDate":"2016-01-01T00:00:00.0000000-00:00"
}
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

Igo*_*gor 9

您不能直接发布非对象,在使用时需要将它们包装在对象容器的旁边FromBody.

[RoutePrefix("api/Example")]
public class ExampleController : ApiController
{
    [Route("Foo")]
    [HttpGet]
    public string Foo([FromUri] string startDate)
    {
        return "This is working";
    }

    [Route("Bar")]
    [HttpPost]
    public string Bar([FromBody] BarData data)
    {
        return "This is not working";
    }
}

public class BarData{
    public DateTime startDate {get;set;}
}
Run Code Online (Sandbox Code Playgroud)

可以工作的另一种方式是使用=符号对这样的值进行形式编码(注意你将它作为非对象发送,花括号已被删除).

"=2016-01-01T00:00:00.0000000-00:00"
Run Code Online (Sandbox Code Playgroud)


hva*_*an3 5

尝试只发布:

{
  "2016-01-01T00:00:00.0000000-00:00"
}
Run Code Online (Sandbox Code Playgroud)

指定属性名称意味着您的端点需要接受具有名为 的属性的对象startDate。在这种情况下,您只想传递一个DateTime.