2015-03-25 68 views
1

是否可以在Web API中定義可選參數或傳入空值作爲OData v4函數中的參數?OData v4 web api中的可選函數參數

鑑於此函數的定義:

ODataConventionModelBuilder builder 
var config = builder.EntityType<model.MyType>() 
    .Collection 
    .Function("Myfunction") 
    .ReturnsCollectionFromEntitySet<model.MyType>("MyType"); 
config.Parameter<int>("Id"); 
config.Parameter<string>("SomeString"); 

與此控制器操作:

[HttpGet] 
public System.Web.OData.PageResult<model.MyType> MyFunction(int id, string someString) 
{ 
    return ...; 
} 

我試圖調用此函數以下方式:

odata/MyType/Namespace.MyFunction(Id=123,SomeString='lalal')做工精細 odata/MyType/Namespace.MyFunction(Id=123)給了我一個404 odata/MyType/Namespace.MyFunction(Id=123,SomeString='')給了我一個400的錯誤'A值是必需的,但沒有出現在請求中。 odata/MyType/Namespace.MyFunction(Id=123,SomeString=null)成功,但將字符串值'Microsoft.OData.Core.ODataNullValue'發送到控制器操作中的SomeString-paramater。我希望得到一個正常的空值,而不是。

測試在版本:

  • Microsoft.AspNet.OData V5.4.0

升級到Microsoft.AspNet.OData V5.5.0-β證明解決問題(部分)。


進一步挖掘證明ModelState對象是無效的。 modelstate對象抱怨說,在第三個(?)參數中使用'someString.String'鍵存在錯誤。錯誤是'需要一個值,但不存在於請求中。'

在歐陽凡提供的代碼示例中,https://github.com/VikingsFan/SampleForOData/tree/master/ODataFunctionSample可以輕鬆地重現該問題。只需運行該示例並在'CustomersController'中檢查ModelState繼承的ModelState屬性。

這似乎是在asp.net web api中的一個錯誤。我改變了我的ModelState邏輯以忽略任何包含'。'的模型狀態鍵,但這只是解決底層問題的一種解決方法。

回答

6

是:

的OData /的MyType/Namespace.MyFunction(ID = 123,SomeString = '')或 的OData /的MyType/Namespace.MyFunction(ID = 123,SomeString = NULL)應該工作

這是一個問題,我認爲它已經在V5.5中修復了,它將在本月底發佈,如果這個問題仍然存在,你可以試試我們的最後一個代碼和github master分支或者V5.5 beta版本。 ,請爲我們開個問題,謝謝!

有很多樣本,在我們github pages

希望這能幫助:)

+0

嘗試了您的建議,但效果並不理想。請看我更新的問題。 – 2015-03-26 10:47:02

+0

我在[github](https://github.com/VikingsFan/SampleForOData/tree/master/ODataFunctionSample)上傳了我的示例,你可以看到SomeString =''和SomeString = null正在工作,而我的示例版本是V5.5 bate。 – 2015-03-27 04:13:00

+0

將檢查出 – 2015-03-27 05:52:58

1

1 - 刪除參數從源代碼定義。

ODataConventionModelBuilder builder 
var config = builder.EntityType<model.MyType>() 
.Collection 
.Function("Myfunction") 
.ReturnsCollectionFromEntitySet<model.MyType>("MyType"); 

2-添加[FromUri]到參數

[HttpGet] 
public System.Web.OData.PageResult<model.MyType> MyFunction([FromUri] int id,[FromUri] string someString) 
{ 
    return ...; 
} 

3-現在,可以調用這樣

odata/MyType/Namespace.MyFunction?Id=123 

或 的OData /的MyType/Namespace.MyFunction?編號方法= 123 & SomeString ='lalal'