2014-02-28 60 views
4

我試圖從服務器使用篩選對象獲取篩選數據,我將其傳遞給服務器端。我設法得到這個工作有一個帖子:

角:

var filter: { includeDeleted: true, foo: bar }; 
$http({ method: 'post', url: 'api/stuff', data: filter }); 

網頁API:

public IEnumerable<StuffResponse> Post([FromBody]Filter filter) 
{ 
    return GetData(filter); 
} 

但我不希望使用後對於這一點,我想使用get。但是,這並不工作:

$http({ method: 'get', url: 'api/stuff', params: filter }); 

網頁API

public IEnumerable<StuffResponse> Get([FromUri]Filter filter) 
{ 
    return GetData(filter); 
} 

還試圖確定PARAMS:{過濾:過濾器}。 如果我嘗試[FromBody]或什麼也不做,過濾器爲空。使用FromUri我至少得到一個對象 - 但沒有數據。任何想法如何解決這個問題,而不創建所有過濾器屬性的輸入參數?

+0

我認爲你不能傳遞數據獲取方法的 –

+0

只需刪除[FromUrl]屬性,並確保在過濾器類, includeDeleted作爲公共財產,它應該工作。 –

+0

標準媒體類型格式化程序不會這樣做。自定義媒體類型格式程序是必需的。看到這裏http://www.codeproject.com/Articles/701182/A-Custom-Model-Binder-for-Passing-Complex-Objects – Chandermani

回答

2

A HTTP GET請求不能包含要發佈到服務器的數據。你想要的是一個查詢字符串到請求。幸運的是angular.http爲它提供了一個選項params

參見:http://docs.angularjs.org/api/ng/service/ $ HTTP#得到

+0

正如你在'get'中看到的例子,我使用'params'。我可以看到過濾器對象被轉換爲請求中的URL參數 - 但服務器無法將其反序列化爲Filter對象 – Trylling

+1

過濾器是一個類名,所以你不能這樣做,你不能將類傳入一個查詢字符串,所以你需要將類更改爲字符串,int,float ... –

+0

Vil的答案提供了一個更清潔的解決方案imo – testpattern

5

是的,你可以發送數據通過params選項

var data ={ 
    property1:value1, 
    property2:value2, 
    property3:value3 
}; 

$http({ method: 'GET', url: 'api/controller/method', params: data }); 

送他們獲取方法,你會在你的API控制器使用[FromUri]收到此方法

public IEnumerable<StuffResponse> Get([FromUri]Filter filter) 
{ 
    return GetData(filter); 
} 

和請求url會是這樣的

http://localhost/api/controller/method?property1=value1&property2=value2&property3=value3 
+0

1UP指出[FromUri]明確指出 –

3

解決這樣說:

角:

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

C#:

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

您可以發送對象,具有Get或Post方法。

腳本

//1. 
var order = { 
    CustomerName: 'MS' }; 
//2. 
var itemDetails = [ 
    { ItemName: 'Desktop', Quantity: 10, UnitPrice: 45000 }, 
    { ItemName: 'Laptop', Quantity: 30, UnitPrice: 80000 }, 
    { ItemName: 'Router', Quantity: 50, UnitPrice: 5000 } 
]; 
//3. 
$.ajax({ 
    url: 'http://localhost:32261/api/HotelBooking/List', 
    type: 'POST', 
    data: {order: order,itemDetails: itemDetails}, 
    ContentType: 'application/json;utf-8', 
    datatype: 'json' 
    }).done(function (resp) { 
     alert("Successful " + resp); 
    }).error(function (err) { 
     alert("Error " + err.status);}); 

API代碼

[Route("api/HotelBooking/List")] 
[HttpPost] 
public IHttpActionResult PostList(JObject objData) 
{ List<ItemDetails > lstItemDetails = new List<ItemDetails >(); 
    dynamic jsonData = objData; 
    JObject orderJson = jsonData.itemDetails; 
    return Ok();}