2012-11-27 3 views
3

Je dois obtenir un de et à ce jour à mon webapi mvc pour récupérer des objets entre ces dates. Voici ma chose préférée que j'ai essayé qui n'a pas fonctionné (j'ai essayé plusieurs choses).MVC WebApi Transmettre un objet en C#

J'ai un objet qui est partagé entre les projets:

public class SchedulerDateSpan 
{ 
    public DateTime StartDate { get; set; } 
    public DateTime EndDate { get; set; } 
} 

Voici ma classe de contrôleur pour get:

public IEnumerable<Appointment> GetAppointments(SchedulerDateSpan dates) 
{ 
    IEnumerable<Appointment> appointments = 
    db.Appointments.Where(
    a => 
    (a.StartDate <= dates.StartDate && a.EndDate >= dates.StartDate) || (a.StartDate <= dates.EndDate && a.EndDate >= dates.EndDate) || 
    (a.StartDate > dates.StartDate && a.EndDate < dates.EndDate)).AsEnumerable(); 
    return appointments; 
} 

Voici mon appel du client où les dates est de type SchedulerDateSpan :

var client = new HttpClient { BaseAddress = new Uri(Properties.Settings.Default.SchedulerWebApi) }; 

client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); 

HttpResponseMessage resp = client.GetAsync(String.Format("api/Appointments/{0}",dates)).Result; 

if (resp.IsSuccessStatusCode) 
{ 
    var appointments = resp.Content.ReadAsAsync<IEnumerable<Appointment>>().Result; 
      ...... 
} 

J'ai aussi essayé de changer à une vente qui semblait fonctionner, mais la n Je ne pouvais pas analyser les résultats avec Content.ReadAsAsync

Toutes les suggestions sont appréciés

Répondre

6

Par défaut, les types complexes (tels que SchedulerDateSpan) doivent être transmis dans le corps de la requête. Vous devez changer marquer le paramètre d'action à [FromUri] si vous voulez que la valeur à transmettre de l'URI:

public IEnumerable<Appointment> GetAppointments([FromUri]SchedulerDateSpan dates) 
{...} 

Vous pouvez ensuite passer les « dates » de la chaîne de requête dans l'Uri, comme ceci:

HttpResponseMessage resp = client.GetAsync(
    String.Format("api/Appointments?dates.StartDate={0}&dates.EndDate={1}", 
    dates.StartDate.ToString(), 
    dates.EndDate.ToString())).Result; 
+0

A travaillé comme un champion! Je vous remercie!! –

3

Si vous essayez de passer un objet complexe via la chaîne de requête alors vous avez besoin pour décorer votre parametre avec l'attribut [FromUri]:

public IEnumerable<Appointment> GetAppointments([FromUri] SchedulerDateSpan dates) 

Votre chaîne de requête ressemblerait à quelque chose comme ceci:

http://server.com/api/Appointments?StartDate=blah1&EndDate=blah2 

Bonne chance!

+0

Cela fonctionne. Je vous remercie. – Matt

Questions connexes