是否可以定义可选参数,或者将空值作为参数传递到Web API中的OData v4函数中?
鉴于此功能定义:
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-paramater。我希望得到一个常规的空值。
测试版本:
升级到Microsoft.AspNet.OData v5.5.0-beta证明可以(部分)解决问题。
进一步挖掘证明了ModelState对象无效。 modelstate对象抱怨第三个(?)参数中存在错误,其中键为'someString.String'。错误是“值是必需的,但请求中不存在。”
Fan Ouyang在https://github.com/VikingsFan/SampleForOData/tree/master/ODataFunctionSample提供的代码示例可以轻松地重现该问题。只需运行示例并检查'CustomersController'中的ModelState继承的ModelState属性。
这似乎是asp.net web api中的一个错误。我更改了我的ModelState逻辑,忽略了包含'。'的任何模型状态键,但这只是潜在问题的解决方法。
答案 0 :(得分:6)
是:
odata / MyType / Namespace.MyFunction(Id = 123,SomeString =&#39;&#39;)或 odata / MyType / Namespace.MyFunction(Id = 123,SomeString = null)应该可以工作
这是一个问题,我认为它已在V5.5中修复,将于本月底发布,您可以在nuget中尝试我们的最后一个代码和github master分支或V5.5 beta如果此问题仍然有效,请为我们打开一个问题,谢谢!
我们的github pages
中有很多样本希望这有助于:)
答案 1 :(得分:1)
1 - 从源代码中删除参数define。
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'