2016-06-23 58 views
2

據這裏的文檔......OData集合參數綁定...他們實際上工作嗎?

http://www.asp.net/web-api/overview/odata-support-in-aspnet-web-api/odata-v3/odata-actions

...

綁定一個動作一個實體集

在前面的例子中,動作綁定到單一實體: 客戶評估單一產品。您還可以將操作綁定到實體集合。只需進行以下更改:

在EDM中,將操作添加到實體的Collection屬性。

var rateAllProducts = builder.Entity()。Collection.Action(「RateAllProducts」);在 控制器方法中,省略關鍵參數。

[HttpPost]公衆詮釋RateAllProducts(ODataActionParameters 參數){// ....}

爲什麼,當我做到這一點它不起作用......

發票編號:

public class InvoiceReference 
{ 
    public string InvoiceNumber { get; set; } 
    public int SupplierId { get; set; } 
} 

行動設置:

var getByRefs = Builder.EntityType<SIHead>().Collection.Action("ByRefs"); 
getByRefs.CollectionParameter<InvoiceReference>("refs"); 
getByRefs.ReturnsCollectionFromEntitySet<SIHead>("SIHead"); 
在控制器

操作方法:

[HttpPost] 
[EnableQuery] 
[ODataRoute("ByRefs")] 
public async Task<IHttpActionResult> ByRefs(ODataActionParameters p) 
{ 
    var refs = p["refs"] as InvoiceReference[]; 
    // exception p is null 
} 

例JSON內容發佈:

[ 
    { 
    "InvoiceNumber": "5100011759|9800006622", 
    "SupplierId": 2 
    }, 
    { 
    "InvoiceNumber": "5100012624|9800006635", 
    "SupplierId": 2 
    }, 
    { 
    "InvoiceNumber": "5100012625|9800006636", 
    "SupplierId": 2 
    } 
] 

在我看來,要麼我錯過了什麼或OData的壞。

+0

嘗試發佈內容,如下面,你需要在文章內容中的JSON格式值指定參數名稱,這應該工作, {「裁判」: [ { 「InvoiceNumber」:「5100011759 | 9800006622 」, 「供應商ID」:2 }, { 「InvoiceNumber」: 「5100012624 | 9800006635」, 「供應商ID」:2 }, { 「InvoiceNumber」: 「5100012625 | 9800006636」, 「供應商ID」 :2 } ] } – Vincent

+0

是的,我做了,不起作用......我還在github上提出了這個問題:https://github.com/OData/WebApi/issues/758 – War

回答

3

從GitHub(感謝薩姆)流汗一些反饋後,我來這的OData的工作方式意味着我們必須張貼的對象,從來沒有直接收集的結論......

我錯過了一些微妙/隱含規則這裏...

我必須提供一個對象(作爲容器),而不僅僅是我想發佈的數組。 我無法直接綁定到ICollection,IList,列表或數組IEnumerable 出於好奇:爲什麼這與正常的webAPI有所不同? WebAPI綁定中的底層綁定框架非常棒。

我不確定這個「怪異」是否有記錄,它看起來像我發佈的東西,我應該總是提供一個對象,而不是直接在體內集合。

發佈一個陣列,因此我必須做的......

​​

..而不是做...

[1,2,3,4] 

...然後在動作總是將發佈集合作爲一個可枚舉...

Task PostStuff(ODataActionParameters p) 
{ 
    var foos = p["foos"] as IEnumerable<Foo>; 
    ... 
} 

...我敢肯定,這個例子給出的地方,但我很確定這個要求,身體總是包含一個對象不(我可能是錯的)。 我想這是爲了鼓勵人們構建強類型的請求體(感覺像一個好的IMO呼叫)。

相關問題