2015-03-25 3 views
1

Возможно ли определить необязательные параметры или передать пустые значения в качестве аргументов в OData v4 в Web API?Опциональный аргумент функции в 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 с ошибкой «Значение требуется, но не содержится в запросе. 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». Ошибка: «Требуется значение, но не присутствует в запросе».

В примере кода, который Fan Ouyang предоставил в https://github.com/VikingsFan/SampleForOData/tree/master/ODataFunctionSample, можно легко воспроизвести эту проблему. Просто запустите образец и проверьте унаследованное свойство ModelState ModelState в «CustomerController».

Это похоже на ошибку в asp.net web api. Я изменил логику ModelState, чтобы игнорировать любой ключевой элемент modelstate, который содержит «.», Но это всего лишь обходной путь для основной проблемы.

ответ

6

Да:

OData/MyType/Namespace.MyFunction (Id = 123, SomeString = '') или OData/MyType/Namespace.MyFunction (Id = 123, SomeString = нуль) должны работать

Это проблема, и я думаю, что она была исправлена ​​в V5.5, который выйдет к концу этого месяца, вы можете попробовать наш последний код и github master branch или V5.5 beta в nuget, если эта проблема все еще активна , пожалуйста, сообщите нам об этом, спасибо!

Есть много образцов в нашем github pages

Надеется, что это может помочь :)

+0

Пробовал ваши предложения, но это было неудовлетворительно. См. Мой обновленный вопрос. –

+0

Я загружаю свой образец для вас в [github] (https://github.com/VikingsFan/SampleForOData/tree/master/ODataFunctionSample), вы можете видеть, как работают SomeString = 'и SomeString = null, и моя примерная версия это V5.5. –

+0

Будет ли это проверено –

1

1-Удалить параметр определяет из исходного кода.

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

2-Add [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'

Смежные вопросы