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.4.0
升级到 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'
是否可以定义可选参数,或者在 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.4.0
升级到 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'