asp.net webapi: как передать необязательные параметры?

Я использую новый веб-API asp.net и хотел бы передать необязательные параметры. Правильно ли нужно заполнить атрибут, чтобы он позволял передавать параметры с использованием символа ??

Я полагаю, что раньше это было сделано с помощью шаблонов uri.

У кого-нибудь есть пример?

В настоящее время я передаю идентификатор в URL-адресе, который поступает в мой контроллер как int. Но мне нужно передать некоторые даты.


person Martin    schedule 31.05.2012    source источник
comment
Не могли бы вы уточнить немного больше, каков ваш сценарий? Какую сигнатуру метода действия вы ожидаете? Какие изменения маршрутизации вы внесли? Некоторая информация об основах маршрутизации веб-API доступна здесь: asp.net/web-api/overview/web-api-routing-and-actions/   -  person marcind    schedule 01.06.2012


Ответы (2)


Вы можете сделать параметр необязательным, используя тип, допускающий значение NULL:

public class OptionalParamsController : ApiController
{
    // GET /api/optionalparams?id=5&optionalDateTime=2012-05-31
    public string Get(int id, DateTime? optionalDateTime)
    {
        return optionalDateTime.HasValue ? optionalDateTime.Value.ToLongDateString() : "No dateTime provided";
    }
}
person Ian Gilroy    schedule 31.05.2012

В дополнение к предыдущему ответу, предоставленному Яном, который является правильным, вы также можете указать значения по умолчанию, которые, как мне кажется, являются более чистым вариантом, который позволяет избежать проверки того, было ли что-то передано или нет. Просто еще один вариант.

public class OptionalParamsController : ApiController
{
    // GET /api/optionalparams?id=5&optionalDateTime=2012-05-31
    public string Get(int id, DateTime optionalDateTime = DateTime.UtcNow.Date)
    {...}
}
person AlexGad    schedule 31.05.2012
comment
Необязательные параметры должны быть константами времени компиляции, DateTime НИКОГДА не является константой времени компиляции. - person frapontillo; 08.08.2012
comment
Упс, да, ты прав. Datetime не может быть указан как необязательный параметр, и я не должен был использовать это в качестве примера. Однако таким же образом можно использовать и другие типы данных. - person AlexGad; 19.08.2012
comment
В моем текущем проекте, если я не укажу значение по умолчанию, маршрут не разрешается, возвращая ошибку HTTP 404 (не найдено). Сигнатура метода должна быть void MyAction(long id, long? value1=-1, long? value2=-1) ... Если я не укажу значения по умолчанию, произойдет сбой, если он не будет передан в строке запроса! - person Loudenvier; 18.06.2013