2014-01-27 2 views
7

У меня есть класс, как это:Дополнительный DateTime Web API

public class FooController : ApiController 
    { 
     [System.Web.Http.Route("live/topperformers")] 
     [System.Web.Http.AcceptVerbs("GET", "POST")] 
     [System.Web.Http.HttpGet] 
     public List<string> GetTopPerformers() 
     { 
      return new List<string>(); 
     } 
} 

Когда я получить доступ к нему, перейдя в «http://foo.com/live/topperformers», он прекрасно работает. Итак, теперь я хочу добавить необязательный параметр DateTime к этому методу, поэтому я изменяю метод, чтобы принять параметр DAteTime и сделать его допустимым.

public class FooController : ApiController 
    { 
     [System.Web.Http.Route("live/topperformers/{dateTime:DateTime}")] 
     [System.Web.Http.AcceptVerbs("GET", "POST")] 
     [System.Web.Http.HttpGet] 
     public List<string> GetTopPerformers(DateTime? dateTime) 
     { 
      return new List<string>(); 
     } 
} 

Когда я пытаюсь получить доступ к URL без параметра, то же самое, как я достигаю раньше -. Это дает 404. Пазинг в значение даты, как «как» http://foo.com/live/topperformers/2010-01-01 "работает нормально, но без даты, это даю 404.

Я думал, Web API поддерживается дополнительный Params таким образом? Я могу просто перегрузить и иметь оба версий, но это возможно только с одним методом?

ответ

13

Установите необязательный параметр = NULL. Попробуйте это:

public class FooController : ApiController 
    { 
     [System.Web.Http.Route("live/topperformers/{dateTime:DateTime?}")] 
     [System.Web.Http.AcceptVerbs("GET", "POST")] 
     [System.Web.Http.HttpGet] 
     public List<string> GetTopPerformers(DateTime? dateTime = null) 
     { 
      return new List<string>(); 
     } 
} 
2

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

public class FooController : ApiController 
{ 
    [System.Web.Http.Route("live/topperformers/{dateTime:datetime?}")] 
    [System.Web.Http.AcceptVerbs("GET", "POST")] 
    [System.Web.Http.HttpGet] 
    public List<string> GetTopPerformers(DateTime? dateTime) 
    { 
     return new List<string>(); 
    } 
} 

Вопросительный знак на маршруте важен. Если вы пропустите его, он будет обработан как требуемый параметр (вот почему вы получаете 404). Для получения дополнительной информации см. Optional URI Parameters and Default Values

+0

спасибо, мне не хватало? отметьте, однако он не сработал, поскольку вы отправили - пока я не присвоил значение null по умолчанию в определении функции переменной «dateTime». благодаря! – dferraro

+1

Моя вина. Я пропустил установку параметра по умолчанию как @sjkm и предлагаемую документацию (имел только знак вопроса в маршруте и контролировал значение по умолчанию). Отлично, что он работает сейчас! –

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