2013-08-12 11 views
7

die Steuerung Gegeben:WebAPI: benutzerdefinierter Parameter-Mapping

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

Und das Modell:

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

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

Und die API url:

/api/my?Point=50.71,4.52 

Ich mag würde das Point Eigentum der Typ Coordinate wird aus dem Querystring - Wert 50.71,4.52 konvertiert, bevor der Wert erreicht wird Controller.

Wo kann ich mich an der WebAPI anmelden, um dies zu ermöglichen?

Antwort

2

Ich habe eine ähnliche Sache mit einem Modellbinder getan. Siehe Option # 3 von this article.

Ihr Modell Binder wäre so etwas wie dieses:

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

Sie müssen es dann in der Aktion in das Modell Bindungssystem verdrahten:

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

Das Problem mit, dass es, dass ich müssen jede einzelne Eigenschaft manuell binden. Nehmen wir an, das Modell hat auch eine 'int Radius'-Eigenschaft, die ich automatisch binden möchte. Wird das möglich sein? – David

+0

AFAIK, ja, du musst alles binden. Schließlich teilen Sie dem System mit, wie die Querystring in eine Instanz eines Typs umgewandelt werden soll. Ich stelle mir vor, du könntest etwas Reflexions-Hokuspokus hinzufügen, um den Rest zu analysieren, aber das habe ich in diesem Zusammenhang nicht gemacht. – ssarabando

+1

Es ist möglich, nur eine bestimmte Art von Eigenschaft zu binden, mehr Details: http://www.asp.net/web-api/overview/formats-and-model-binding/parameter-binding-in-aspnet-web- api – David