2015-06-23 97 views
1

我想使用AngularJS將JavaScript項目發佈到C#WebAPI調用。以下是我想要做的。將複雜的對象從AngularJS傳遞給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改變地址到地址一切工作正常。

+0

我猜想,模型綁定失敗,你可以看看你發送什麼POST數據出來嗎?它需要完全匹配模型綁定才能成功。 –

+0

如果你登錄,「person」看起來像什麼? –

回答

2

您的文章將是json格式,它將人物對象分配到person,Address對象必須是格式良好的對象,因爲它包含子屬性。

代碼

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

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

這種方法允許發送具有陣列和子對象的複雜對象通過HTTP GET:

角:

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

C#:

[HttpGet] 
public string Get(string personStr) 
{ 
    Person obj = new JavaScriptSerializer().Deserialize<Person>(personStr); 
    ... 
} 
0

你想做什麼是不可能的,但是這個解決方案允許你在.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"); 
} 
相關問題