2015-03-25 65 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'