2013-08-12 9 views
7

WebAPIの:コントローラを考えると、カスタムパラメータマッピング

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

とモデル:

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

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

そしてAPIのURL:

/api/my?Point=50.71,4.52 

私はのPointプロパティが欲しいですタイプCoordinateは、クエリ文字列値50.71,4.52から変換されてからコントローラ。

どこでWebAPIを実行すればいいですか?

答えて

2

モデルバインダーでも同様のことをしました。 this articleのオプション#3を参照してください。

あなたのモデルバインダーは、このようなものになるだろう

:あなたは、その後のアクションでモデルバインディングシステムにそれを配線する必要があり

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

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

問題をそれそれとI'LLこと手動ですべてのプロパティをバインドする必要があります。モデルに 'int Radius'プロパティがあるとしましょう。私はそれを自動的にバインドしたいと思います。それは可能でしょうか? – David

+0

AFAIK、はい、すべてを縛る必要があります。結局のところ、クエリ文字列を型のインスタンスに変換する方法をシステムに伝えています。私はあなたが残りの部分を解析するためにいくつかのリフレクション・フォーカスを加えることができると思いますが、私はこの文脈でやっていません。 – ssarabando

+1

特定の種類のプロパティのみをバインドすることは可能です。詳細については、http://www.asp.net/web-api/overview/formats-and-model-binding/parameter-binding-in-aspnet-web- api – David

関連する問題