C# Web API-为什么我必须使用FormDataCollection?

C# Web API-为什么我必须使用FormDataCollection?,c#,asp.net-web-api,C#,Asp.net Web Api,我刚刚开始使用Web API,并且总体上喜欢它,但是发现使用“application/x-www-form-urlencoded”从POST请求读取数据是一件痛苦的事情。我想看看有没有更好的办法。我的应用程序(一个x-可编辑表单)向我的控制器发出一个简单的HTTP POST请求,有3个值:pk、name、value 请求如下: POSThttp://localhost/XXXX.Website/api/Category/Set HTTP/1.1 主机:本地主机 连接:保持活力 内容长度:39 接

我刚刚开始使用Web API,并且总体上喜欢它,但是发现使用“application/x-www-form-urlencoded”从POST请求读取数据是一件痛苦的事情。我想看看有没有更好的办法。我的应用程序(一个x-可编辑表单)向我的控制器发出一个简单的HTTP POST请求,有3个值:pk、name、value

请求如下:

POSThttp://localhost/XXXX.Website/api/Category/Set HTTP/1.1
主机:本地主机
连接:保持活力
内容长度:39
接受:*/*
来源:http://localhost
X-request-With:XMLHttpRequest
用户代理:Mozilla/5.0(Windows NT 6.2;WOW64)AppleWebKit/537.36(KHTML,如Gecko)Chrome/28.0.1500.95 Safari/537.36
内容类型:application/x-www-form-urlencoded;字符集=UTF-8
推荐人:http://localhost/XXXX.Website/
接受编码:gzip、deflate、sdch
接受语言:en-US,en;q=0.8
饼干:。。。
name=myPropertyName&value=myTestValue&pk=1
我在ApicController中的操作方法是:

public HttpResponseMessage PostSet(FormDataCollection set) {}
我可以很好地从FormDataCollection中读取表单值,但是有人可以向我解释为什么我不能简单地写:

public HttpResponseMessage PostSet(string name, string value, id pk) {}
或者将其映射到模型


我认为Web API应该能够从表单值映射参数?

您需要使用
FromBody
属性来修饰参数。但这只适用于一个参数。是的,我能感觉到你皱着眉头。像这样的方法应该会奏效:

public HttpResponseMessage PostSet([FromBody] string name) {}
但是,好消息是,您可以使用
[ModelBinder]
属性将表单参数绑定到
模型

查看详细信息。

感谢文章中的链接:),Web API默认从URI读取简单类型,或从正文读取复杂类型(或同时读取两者)。您可以强制Web API从主体中读取简单类型,而不是带有[FromBody]的URI,但是请求流只读取一次,并且读取器不能返回读取其他简单参数。这似乎是一个实施问题,比任何事情都重要。最终为我的价值观制作了一个模型和模型绑定器!