OData v4 web 中的可选函数参数 api

Optional function argument in OData v4 web api

是否可以定义可选参数,或者在 Web 中的 OData v4 函数中将空值作为参数传递 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 错误 '需要一个值,但请求中不存在。 odata/MyType/Namespace.MyFunction(Id=123,SomeString=null) 成功,但将字符串值 'Microsoft.OData.Core.ODataNullValue' 发送到控制器操作中的 SomeString 参数中。我希望得到一个常规的空值。

测试版本:


升级到 Microsoft.AspNet.OData v5.5.0-beta 证明可以解决问题(部分)。


进一步挖掘证明 ModelState 对象无效。 modelstate 对象抱怨在第三个(?)参数中有一个错误,键为 'someString.String'。错误是'A value is required but was not present in the request.'

范欧阳在https://github.com/VikingsFan/SampleForOData/tree/master/ODataFunctionSample提供的代码示例中可以轻松重现该问题。只需 运行 示例并检查 'CustomersController'.

中的 ModelState 继承的 ModelState 属性

这似乎是 asp.net 网络 api 中的错误。我更改了我的 ModelState 逻辑以忽略任何包含“.”的 modelstate 键,但这只是潜在问题的解决方法。

是:

odata/MyType/Namespace.MyFunction(Id=123,SomeString='') 或 odata/MyType/Namespace.MyFunction(Id=123,SomeString=null) 应该工作

这是一个问题,我认为它已在本月底发布的 V5.5 中修复,您可以尝试我们最后的代码和 github master 分支或 V5.5 beta在 nuget 中,如果这个问题仍然存在,请为我们打开一个问题,谢谢!

我们的 github pages

中有很多示例

希望这对您有所帮助:)

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?Id=123&SomeString='lalal'