2012-09-11 16 views
36

Ben şu Web API (GET) vardır:Karmaşık bir nesneyi parametre olarak kabul etmek için ASP.NET Web API'sı nasıl geliştirilir?

public class UsersController : ApiController 
{ 
    public IEnumerable<Users> Get(string firstName, string LastName, DateTime birthDate) 
    { 
     // Code 
    } 
} 

Bu bir GET, bu yüzden böyle diyebilirsiniz:

http://localhost/api/users?firstName=john&LastName=smith&birthDate=1979/01/01 

ve kullanıcıya (ler) in bir xml sonuç alırsınız.

mümkün böyle bir sınıfa parametreleri saklanması mı: o zaman

public class MyApiParameters 
{ 
    public string FirstName {get; set;} 
    public string LastName {get; set;} 
    public DateTime BirthDate {get; set;} 
} 

Ve var: Ben her zaman denedim ve

public IEnumerable<Users> Get(MyApiParameters parameters) 

Elde http://localhost/api/users?firstName=john&LastName=smith&birthDate=1979/01/01 sonucu deneyin parameter boş.

cevap

62

Varsayılan olarak, karmaşık türler vücuttan okunur, bu yüzden boş alırsınız. Eğer modeli cilt sorgu dizesi gelen modeli çekin isterseniz

public IEnumerable<Users> Get([FromUri]MyApiParameters parameters) 

için eylem imzası değiştirin

. http://blogs.msdn.com/b/jmstall/archive/2012/04/16/how-webapi-does-parameter-binding.aspx

+0

Nice catch -

Web API parametresi MSFT Mike Stall tarafından mükemmel makalesinde bağlayıcı yapar hakkında daha fazla bilgi edinebilirsiniz. Biliyorum bir şey kaçırıyordum! :) – Tohid

+0

Bu bana HER SESSLE ZAMANI Web API geliştirmeye geri döndüğümü ısırıyor gibi görünüyor. Swashbuckle'ın emin olmak için bir şeyler yapmasını ve Web API'sının bu verilerin gelip gitmediğini/querystring verileri veya vücut verileri olarak kalmasına ilişkin varsayımları ile senkronize olmasını diliyorum. Ve Web API'sının GET çağrıları üzerinden Vücuttan karmaşık tiplerin okunduğunu düşünmüyorum - bu hiç bir anlam ifade etmiyor ve özellikle bir varsayılan olarak değil. Teşekkürler Tohid ve @Filip - Bu soru beni defalarca kurtardı! – Jaxidian

İlgili konular