2013-08-12 4 views
7

Dato il controller:WebAPI: parametro personalizzato mappatura

public class MyController : ApiController 
{ 
    public MyResponse Get([FromUri] MyRequest request) 
    { 
     // do stuff 
    } 
} 

E il modello:

public class MyRequest 
{ 
    public Coordinate Point { get; set; } 
    // other properties 
} 

public class Coordinate 
{ 
    public decimal X { get; set; } 
    public decimal Y { get; set; } 
} 

e l'URL API:

/api/my?Point=50.71,4.52 

mi piacerebbe la proprietà Point di il tipo Coordinate da convertire dal valore di querystring 50.71,4.52 prima di raggiungere il controller.

Dove posso collegarmi a WebAPI per farlo accadere?

risposta

2

Ho fatto una cosa simile con un legante modello. Vedere l'opzione n. 3 di this article.

Il modello legante sarebbe qualcosa di simile a questo:

public class MyRequestModelBinder : IModelBinder { 
    public bool BindModel(HttpActionContext actionContext, 
          ModelBindingContext bindingContext) { 
     var key = "Point"; 
     var val = bindingContext.ValueProvider.GetValue(key); 
     if (val != null) { 
      var s = val.AttemptedValue as string; 
      if (s != null) { 
       var points = s.Split(','); 
       bindingContext.Model = new Models.MyRequest { 
        Point = new Models.Coordinate { 
         X = Convert.ToDecimal(points[0], 
               CultureInfo.InvariantCulture), 
         Y = Convert.ToDecimal(points[1], 
               CultureInfo.InvariantCulture) 
        } 
       }; 
       return true; 
      } 
     } 
     return false; 
    } 
} 

È quindi necessario collegare in su nel sistema vincolante modello nell'azione:

public class MyController : ApiController 
{ 
    // GET api/values 
    public MyRequest Get([FromUri(BinderType=typeof(MyRequestModelBinder))] MyRequest request) 
    { 
     return request; 
    } 
} 
+0

Il problema con che che io devono associare ogni singola proprietà manualmente. Diciamo che il modello ha anche una proprietà 'int Radius', mi piacerebbe che legasse automaticamente. Sarebbe possibile? – David

+0

AFAIK, sì, devi legare tutto. Dopotutto, stai dicendo al sistema come trasformare la querystring in un'istanza di un tipo. Immagino che potresti aggiungere un po 'di riflessione hocus pocus per analizzare il resto, ma che non ho fatto in questo contesto. – ssarabando

+1

È possibile associare solo un determinato tipo di proprietà, maggiori dettagli: http://www.asp.net/web-api/overview/formats-and-model-binding/parameter-binding-in-aspnet-web- api – David