2016-05-12 6 views
2

ASP.NETコアのAPIコントローラ用のカスタムパラメータバインディングを行いたい状況があります.WebAPI 2.0では、さまざまな実装を行うことでプリミティブ型へのカスタムバインディングを実行することができましたIValueProviderなどのインターフェイスとValueProviderFactoryを提供します。これは、the documentation I found hereから私が理解している限り、ASP.NETのコアの場合とは思われません。ASP.NETコアカスタムパラメータバインド

私はMutableObjectModelBinderの動作を無効にしてthis articleに私を導いたことに気付いた。this SO post。私は別の方法のための任意のドキュメントを見つけるように見えることはできませんが、私はちょうどプリミティブ型を取り扱っておりますので、これは必ずしも私に権利いないようです

[HttpGet] 
    [Route("api/{domain}/[controller]")] 
    public IEnumerable<string> Get([ModelBinder(BinderType = typeof(MyCustomBinder))]string orderby) 
    { 
     //Do stuff here 
    } 

:私のようなものを線に沿って何かを行うことができ、それを表示されますこれを行う。どんな助けもありがとう。

EDIT:誰かがこの問題に遭遇した場合は、締め切りを守るためにパラメータを解析するためにヘルパークラスを使うことにしました。私がこれを理解する機会を得ると、私はこの問題に関連する解決策を具体的に返信して投稿します。

答えて

1

カスタムバインダーは

public class MyCustomBinder : IModelBinder 
{ 
    public Task BindModelAsync(ModelBindingContext bindingContext) 
    { 
     if (bindingContext.ModelType != typeof(MyCustom)) 
     { 
      return TaskCache.CompletedTask; 
     } 

     var parameters = new Dictionary<string, string>(); 
     foreach (var parameter in bindingContext.ModelType.GetProperties()) 
     { 
      var valueProviderResult = bindingContext.ValueProvider.GetValue(parameter.Name); 
      if (valueProviderResult.FirstValue != null) 
      { 
       parameters.Add(parameter.Name, valueProviderResult.FirstValue); 
      } 
     } 

     var result = Activator.CreateInstance(bindingContext.ModelType); 

     //write your custom code to map the result with the parameters 

     bindingContext.Result = ModelBindingResult.Success(result); 

     return TaskCache.CompletedTask; 
    } 
} 

カスタムタイプのように行くことができるカスタムタイプ

public class MyCustomBinderProvider : IModelBinderProvider 
{ 
    public IModelBinder GetBinder(ModelBinderProviderContext context) 
    { 
     if (context == null) 
     { 
      throw new ArgumentNullException(nameof(context)); 
     } 

     if (context.Metadata.ModelType == typeof(MyCustom)) 
     { 
      return new BinderTypeModelBinder(typeof(MyCustomBinder)); 
     } 

     return null; 
    } 
} 

用バインダープロバイダクラスを作成し、サービス

services.AddMvc(c => 
{ 
     c.ModelBinderProviders.Insert(0, new MyCustomBinderProvider()); 
}); 

とに登録クラス

[ModelBinder(BinderType = typeof(MyCustomBinder))] 
public class MyCustom 
{ 
    public int Page { get; set; } 
    public int Rows { get; set; } 
} 

とあなたのコントローラがこの答えは働くクエリ文字列パラメータ

[HttpGet("data")] 
public DataTransferObject GetData(MyCustom query) 
{ 
} 
+0

としてカスタムクラスを取るが、あなたは、 '必要はありません、注目に値することができます[ModelBinder(BinderType = typeof演算(MyCustomBinderを))]'の属性あなたのカスタムタイプクラス。 'ModelBinderProviders'コレクションにModelBinderProviderを置くだけで十分です。 – Pondidum