【问题标题】:What does Web API need to bind models?Web API 需要什么来绑定模型?
【发布时间】:2015-05-13 22:18:27
【问题描述】:

使用 Angular,我发送一个 HTTP 请求

$scope.addFiles = function (files) {
        for (var i = 0; i < files.length; i++) {
            var file = files[i];
            $http.post('/api/files/addFiles', JSON.stringify({ testName: "test", someRandomCrap:"asdf"}));
        }
    }

我在控制器中正确接收了请求。但是,响应为空:

在验证内容头没有问题并且信息确实发送后,我将示例对象替换为通用对象:

你瞧。有用!由此,我的猜测是 Web API 无法绑定到我的对象。这让我想到了我的问题:Web API 需要绑定到对象吗?

测试对象:

public class TestObject
{
    string testName { get; set; }
    string someRandomCrap { get; set; }
}

【问题讨论】:

  • 最有可能的问题是帖子正在发送{ testName: "test", someRandomCrap:"asdf"},而带有TestObject的签名可能需要{ fileName : { testName: "test", someRandomCrap:"asdf"} }
  • 尝试删除JSON.stringify
  • @ErikPhilips 似乎不是这样。除非我在某处遗漏了一些案例。

标签: c# angularjs asp.net-web-api


【解决方案1】:

试试这个:

$scope.addFiles = function (files) {
    for (var i = 0; i < files.length; i++) {
        var file = files[i];
        $http.post('/api/files/addFiles', { testName: "test", someRandomCrap:"asdf"});
    }
}

两件事:

  • 在asp.net api中,整个请求体都绑定了一个参数,所以我们不需要在请求体中指定一个属性名。看看这个:web api put is recognizing query strings but not body
  • 不需要JSON.stringify,否则它将把你的整个对象当作一个字符串。在您的第二张图片中,fileName 的类型为字符串

还可以尝试公开您的属性:

public class TestObject
{
    public string testName { get; set; }
    public string someRandomCrap { get; set; }
}

【讨论】:

  • 让我试试看!发生同样的事情。通用对象获取数据,而映射它的尝试没有
  • @Dudemanword:你清除浏览器缓存了吗?如果还是不行,试试:[FromBody]TestObject fileName
  • @Dudemanword:在 Angular 中,帖子的默认内容类型标题是 application/json(正确)docs.angularjs.org/api/ng/service/$http。检查您的内容类型是否不同。
  • @Dudemanword:我不确定,但看起来您需要公开您的属性。请参阅我的更新答案。
【解决方案2】:

只需要对象本身:

$scope.addFiles = function (files) {
    for (var i = 0; i < files.length; i++) {
        var file = files[i];
        $http.post('/api/files/addFiles',{ fileName: { testName: "test", someRandomCrap:"asdf"}});
    }
}

【讨论】:

  • 哈哈!我的逻辑一定有缺陷。这是我的想法:当 Post 被调用时,它期待与 TestObject 的签名匹配的东西。呼叫是使用该签名进行的。还是参数名称是该签名的一部分?
  • 你必须匹配整个对象!包括您正在调用的参数的名称
  • 嗯,这似乎不起作用。当我使用通用对象时,我可以看到它被调用,但是,映射仍然没有发生
猜你喜欢
  • 2014-09-10
  • 2013-11-29
  • 1970-01-01
  • 1970-01-01
  • 2018-01-30
  • 2017-07-30
  • 1970-01-01
  • 1970-01-01
  • 2012-08-28
相关资源
最近更新 更多