4

我创建了一个 ASP.Net API 控制器,我正在尝试使用 Angular 向其发出 POST 请求。请求到达我的控制器方法,但参数值为空。

我的角度代码:

$http({ method: 'POST', url: '/api/Contents', data: "value=foobar", headers: { 'Content-Type': 'application/x-www-form-urlencoded' } }).
    success(function(data) {
                }).
    error(function(data, status, headers, config) {

    });

我也尝试过使用 json (Json 是我最终想要的):

$http({ method: 'POST', url: '/api/Contents', data: { "foo": "bar", "foo2": "bar2" }, headers: { 'Content-Type': 'application/json'} }).
    success(function(data) {
                }).
    error(function(data, status, headers, config) {

    });

我的(非常简单的)控制器方法如下所示:

public void Post([FromBody]string value)
{
    //But Value is NULL!!!!!!
}

以下是我从 Chrome 中截取的请求标头中的一些值(我认为可能很有趣的值:

  • 请求方法:POST
  • 状态码:204 无内容
  • 接受:应用程序/json,文本/纯文本,/
  • 内容类型:application/x-www-form-urlencoded
  • X-Requested-With: XMLHttpRequest
  • 表单 Dataview sourceview URL 编码
  • 值:foobar
  • 服务器:Microsoft-IIS/8.0
  • X-AspNet-版本:4.0.30319

我错过了什么?

4

1 回答 1

6

像这样:

$http({ 
    method: 'POST', 
    url: '/api/Contents', 
    data: "=foobar", 
    headers: { 'Content-Type': 'application/x-www-form-urlencoded' }
}).success(function(data) {

}).error(function(data, status, headers, config) {

});

注意=foobar数据参数。在这种情况下,您不应指定参数名称。是的,我知道,不要问。

您可以阅读更多关于how model binding in the Web API works. 如果你像我一样发现这绝对是疯了,你可以考虑ServiceStack改用。

或者,您可以使用视图模型:

public class ContentsModel
{
    public string Value { get; set; }
}

然后让您的控制器操作将视图模型作为参数:

public void Post(ContentsModel model)
{
}

现在你可以发送一个普通的 JSON 请求了:

$http({ 
    method: 'POST', 
    url: '/api/Contents', 
    data: JSON.stringify({ "value": "the value" }), 
    headers: { 'Content-Type': 'application/json' } 
}).success(function(data) {

}).error(function(data, status, headers, config) {

});

另请注意,如果要发送 JSON,则需要使用该JSON.stringify方法将 javascript 对象转换为 JSON 字符串。

于 2013-04-22T16:08:39.220 回答