Javascript 从AngularJS向WebAPI传递复杂对象

Javascript 从AngularJS向WebAPI传递复杂对象,javascript,c#,angularjs,asp.net-web-api,Javascript,C#,Angularjs,Asp.net Web Api,我正在尝试使用AngularJS将JavaScript项发布到C#WebAPI调用。下面是我想做的 物体 class Address { public string Street { get; set; } public string City { get; set; } public string State { get; set; } } class Person { public string FirstName { get; set; } publ

我正在尝试使用AngularJS将JavaScript项发布到C#WebAPI调用。下面是我想做的

物体

class Address
{
    public string Street { get; set; }
    public string City { get; set; }
    public string State { get; set; }
}
class Person
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public Address address { get; set; }
}
我的C#控制器功能

    [Route("Update/")]
    public void Update(Person person)
    {
        _service.Update(person);
    }
AngularJS呼叫

    this.update = function (person) {
        $http.post("api/Person/Update/", person);
    }
当我在WebAPI控制器中收到对象时,地址为空。为什么没有收到这些数据

编辑 我在最初的问题中错了,Person对象是这样的

class Person
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public IAddress address { get; set; }
}

当我将地址从IAddress更改为address时,一切都按预期进行。

您的帖子将采用json格式,将person对象分配给
person
地址
对象必须是格式良好的对象,因为它包含子属性

代码

$scope.person = {
  'Street': '',
  'LastName': '',
  'Address': {
     'Street': '',
     'City': '',
     'State': '',
  },
}

this.update = function (person) {
    $http.post("api/Person/Update/", { person : $scope.person});
}

此方法允许通过HTTP GET发送带有数组和子对象的复杂对象:

角度:

$http({
       url: '/myApiUrl',
       method: 'GET',
       params: { personStr: angular.toJson(person, false) }
      })
C#:

[HttpGet]
公共字符串Get(字符串personStr)
{
Person obj=new JavaScriptSerializer()。反序列化(personStr);
...
}

您想做的事情是不可能的,但此解决方案允许您在.NET端使用复杂对象。GET请求中没有主体,因此必须将对象添加到URI中

将web api方法更改为:

[Route("Update/")]
public void Update([FromUri]Person person)
{
    _service.Update(person);
}
将角度代码更改为:

this.update = function (person) {
    $http.post("api/Person/Update?FirstName=John&LastName=Doe&Address%5BStreet%5D=123%20Main%20St&Address%5BCity%5D=Knoxville&Address%5BState%5D=Tennessee");
}

我猜模型绑定失败了,你能看看你发送了什么POST数据吗?它需要非常精确地匹配模型绑定才能成功。如果您记录它,
person
会是什么样子?
this.update = function (person) {
    $http.post("api/Person/Update?FirstName=John&LastName=Doe&Address%5BStreet%5D=123%20Main%20St&Address%5BCity%5D=Knoxville&Address%5BState%5D=Tennessee");
}