2014-01-27 6 views
7

Ich habe eine Klasse wie folgt:Optional 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>(); 
     } 
} 

Als ich darauf zugreifen, indem zu gehen „http://foo.com/live/topperformers“, es funktioniert gut. Jetzt möchte ich einen optionalen DateTime-Parameter zu dieser Methode hinzufügen, also ändere ich die Methode, um einen DAteTime-Parameter zu nehmen und mache NULL-Werte.

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>(); 
     } 
} 

Wenn ich versuche, die URL ohne Parameter zuzugreifen, das gleiche wie ich vorher zugreifen -. Einen Wert 404. Pasing in dem Datum gibt wie „wie“ http://foo.com/live/topperformers/2010-01-01 "funktioniert gut, aber ohne Datum es, Versuchen ergibt 404.

ich dachte, Web-API auf diese Weise optional params unterstützt? ich kann einfach überlastet und haben beide Versionen, aber ist dies möglich, mit nur einer Methode?

Antwort

13

den optionalen Parameter Set = null. dies:

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

Sie haben es versäumt, Ihre Route optional zu machen. Ändern Sie Ihren Code in den folgenden Code:

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>(); 
    } 
} 

Das Fragezeichen in der Route ist wichtig. Wenn Sie es verpassen, wird es wie ein erforderlicher Parameter gehandhabt (deshalb erhalten Sie einen 404). Weitere Informationen finden Sie unter Optional URI Parameters and Default Values

+0

danke, mir fehlte die? markieren, funktionierte jedoch nicht wie Sie gepostet - bis ich einen Standardwert von Null in der Funktionsdefinition der Variable 'dateTime' zugewiesen. Vielen Dank! – dferraro

+1

Meine Schuld. Ich habe versäumt, den Standardparameter als @sjkm und die vorgeschlagene Dokumentation zu setzen (hatte nur das Fragezeichen in der Route im Hinterkopf und hatte den Standardwert überwacht). Schön, dass es jetzt funktioniert! –