如何在ApiController中检索POST正文数据?

时间:2013-11-27 13:46:57

标签: c# html asp.net-mvc

我使用的是asp.net 4.5和最新的MVC版本。在html页面中发布表单时,我需要从标题中检索deviceIdbody。在行public void Post([FromBody]string value)值处,它始终为空。

我在这里做错了什么?

  namespace WebApi.Controllers
    {
        public class NotificationController : ApiController
        {
            // GET api/notification
            public IEnumerable<string> Get()
            {
                return new string[] { "value1", "value2" };
            }

            // GET api/notification/5
            public string Get(int id)
            {
                return "value";
            }

            // POST api/notification
            public void Post([FromBody]string value)
            {
// value it is always null
            }

            // PUT api/notification/5
            public void Put(int id, [FromBody]string value)
            {
            }

            // DELETE api/notification/5
            public void Delete(int id)
            {
            }
        }
    }


<form action="/api/notification" method="post">
    DeviceId: <input name="deviceId" value="gateeMachine">
    Body: <input name="body" value="Warning Out of Paper">
    <button>Tes send</button>
</form>

2 个答案:

答案 0 :(得分:5)

模型绑定器将参数与表单中名称属性的值匹配。我发现创建模型不太令人头疼(以下是未经测试的代码):

public class Devices
{
     public string DeviceId { get; set; }
     public string Body { get; set; }
}

行动:

public void Post(Devices device)
{

}

表格:

<form action="/api/notification" method="post">
    Device Id: <input name="DeviceId" value="gateeMachine">
    Body: <input name="Body" value="Warning Out of Paper">
    <button>Test send</button>
</form>

- 编辑:事实证明,不支持绑定多个表单值(请参阅this answer),因此模型是可行的方法。您可以将表单值序列化为查询字符串。您还可以将值序列化为单个字符串(即JSON或XML),然后反序列化服务器端,但实际上,模型是此处最直接的路径。

答案 1 :(得分:0)

你的帖子接受一个参数'value',你试图发送两个参数'deviceId'和'body'。修复这将是一个很好的起点。