【问题标题】:Why does the Web API controller get null data from client through POST request?为什么 Web API 控制器通过 POST 请求从客户端获取空数据?
【发布时间】:2017-01-16 08:27:15
【问题描述】:

我有一个 AngularJS 应用程序通过 POST 请求将对象数组发送到 Web API 控制器方法。在服务器上,我有以下方法定义:

[HttpPost]
[Route("Active")]
public async Task<IHttpActionResult> Post(IList<Media> mediaFiles)
{
    try
    {
        foreach (var file in mediaFiles)
        {
            await Task.Factory.StartNew(() => PublicData.SetInactiveMedia(file.Id, file.Active));
        }
        return Ok();
    }
    catch (ArgumentException e)
    {

        return BadRequest(e.Message);
    }
}

我使用 $resource 工厂来与服务器交互(但我不得不提到我也尝试过使用 $http 并且没有出现任何差异)。方法是这样的:

var activeMedia = $resource('/api/adminhotspotsmedia/active', { save: { method: 'POST' } });
var setActiveMedia = function (mediaFiles) {
            activeMedia.save(mediaFiles);
        }

mediaFiles 变量是与服务器上的Media 模型完全匹配的对象数组。

在开发者控制台中,我可以看到与请求相关联的请求负载:

所以阵列正试图到达服务器,但它不能。服务器获取对象列表的空值。我会补充一点,我尝试过使用:

  • [FromBody]标签
  • dynamic 而不是 IList&lt;Media&gt;
  • IList&lt;object&gt; 而不是 IList&lt;Media&gt;

问题仍然存在。会是什么?

【问题讨论】:

  • 不要使用界面。除非您有自定义模型绑定器,否则模型绑定器将不知道如何处理它。它需要具体的类来绑定,所以使用具体的对象。所以要么使用实际的List&lt;Media&gt; 或数组Media[]

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


【解决方案1】:

默认情况下,模型绑定器不知道如何处理接口,除非您有一个自定义模型绑定器,该模型绑定器知道期望什么以及期望的行为是什么。

您也可以使用实际的List&lt;Media&gt;

[HttpPost]
[Route("Active")]
public async Task<IHttpActionResult> Post(List<Media> mediaFiles) { ... }

或数组Media[]

[HttpPost]
[Route("Active")]
public async Task<IHttpActionResult> Post(Media[] mediaFiles) { ... }

【讨论】:

  • 我之前已经从List 切换到IList,因为我不了解这种行为。现在我已经尝试了你的两个建议,但它们都不起作用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-13
  • 2018-10-11
  • 1970-01-01
相关资源
最近更新 更多