如何在API控制器操作中将复杂对象作为$ http参数传递并作为视图模型接收

时间:2019-02-12 08:11:39

标签: c# angularjs asp.net-mvc api-design

我有一个API端点。控制器动作如下所示-

public IHttpActionResult Post(string entityType, SomeModel someModel)

SomeModel是一个视图模型,它看起来像这样-

public class SomeModel
  {
    public long? Id { get; set; }
    public long EntityId { get; set; }
    public string Text { get; set; }
  }

我正在从angularjs end调用此API端点-

return $http({
            method: 'POST',
            url: ENV.apiEndpoint + 'tags',
            params:{
              // here I want to pass parameters which will automatically map into API's two parameter(one string and the other view model)
            }
        });

我不想更改我的API端点。我的问题是如何从有角度的末端传递参数,该参数会自动映射到API方法的参数中。

我尝试了很多事情-

var someModel = {id: 1, text:"something", entityId: 12}
return $http({
            method: 'POST',
            url: ENV.apiEndpoint + 'tags',
            params:{
              entityType: entityType,
              someModel: JSON.stringify(someModel)
            }
        });

或者,

var someModel = {id: 1, text:"something"}
return $http({
            method: 'POST',
            url: ENV.apiEndpoint + 'tags',
            params:{
              entityType: entityType,
              id: 1,
              text: "something",
              entityId: 12
            }
        });

这些似乎都不起作用。意味着参数没有正确地映射到API方法的参数中。在这种情况下传递参数的理想方法是什么?

我不想更改API方法的参数。我知道我可以使用[FromBody] or [FromURI]。但是我不想那样做。

1 个答案:

答案 0 :(得分:1)

您应该能够做到

    $http({
        method: 'POST',
        url: ENV.apiEndpoint + 'tags',
        params:{
          entityType: entityType
        },
        data: someModel
    });

POST请求中的默认Web api(和asp.net mvc)默认反序列化(引用)来自HTTP消息正文( data )的对象参数,以及来自URL参数的值类型和字符串参数( params )。