Мне нужно реализовать следующий метод WebAPI:
/api/books?author=XXX&title=XXX&isbn=XXX&somethingelse=XXX&date=XXX
Все параметры строки запроса могут быть нулевыми. То есть вызывающая сторона может указать от 0 до всех 5 параметров.
В бета-версии MVC4 я делал следующее:
public class BooksController : ApiController
{
// GET /api/books?author=tolk&title=lord&isbn=91&somethingelse=ABC&date=1970-01-01
public string GetFindBooks(string author, string title, string isbn, string somethingelse, DateTime? date)
{
// ...
}
}
MVC4 RC больше не ведет себя так. Если я укажу менее 5 параметров, он отвечает 404
поговоркой:
На контроллере «Книги» не найдено никаких действий, соответствующих запросу.
Какова правильная сигнатура метода, чтобы он вел себя так, как раньше, без необходимости указывать необязательный параметр в маршрутизации URL?
c#
url
asp.net-web-api
query-string
frapontillo
источник
источник
Get
того, что он автоматически связан сHTTP GET
методом ...string?
не является допустимым типом. Вы не можете объявитьstring
как обнуляемый тип, так как это ссылочный тип.Ответы:
Эта проблема была исправлена в обычном выпуске MVC4. Теперь вы можете сделать:
и все будет работать из коробки.
источник
null
считается константным выражением и, следовательно, допустимым значением по умолчанию .Можно передать несколько параметров как одну модель, как предложил Виджай. Это работает для GET, когда вы используете атрибут параметра FromUri. Это говорит WebAPI заполнить модель из параметров запроса.
Результатом является более чистое действие контроллера с одним параметром. Для получения дополнительной информации см .: http://www.asp.net/web-api/overview/formats-and-model-binding/parameter-binding-in-aspnet-web-api
Он даже поддерживает несколько параметров, если свойства не конфликтуют.
Обновление :
чтобы гарантировать, что значения являются необязательными, обязательно используйте ссылочные типы или обнуляемые значения (например, int?) Для свойств моделей.
источник
int Skip
), и для этого свойства не задан параметр запроса, метод API Controller все равно будет успешно соответствовать запросу, а значение дляSkip
будет просто значением по умолчанию для этого типа, или 0 в этом случаеИспользуйте начальные значения по умолчанию для всех параметров, как показано ниже
источник
DateTime
не обнуляется. Я уже пытался использоватьDateTime?
вместо этого, но тогда MVC не отображает запрос на данный метод, если я установил только некоторые параметры в моем HTTP-запросе.DateTime
это не обнуляемый тип данных. Ваш код не должен компилироваться, так как вы не сможете присвоитьnull
значение параметру типаDateTime
. Возможно, вы должны изменить егоDateTime?
или использовать другое значение для значения по умолчаниюDateTime.Now
.Datetime.Now
не может использоваться при инициализации параметров по умолчанию, я исправлен.если вы хотите передать несколько параметров, вы можете создать модель вместо передачи нескольких параметров.
в случае, если вы не хотите передавать какой-либо параметр, вы также можете пропустить его, и ваш код будет выглядеть аккуратно и чисто.
источник
Значения по умолчанию не могут быть предоставлены для параметров, которые не объявлены '
optional
'В твоем
WebApiConfig
источник