2017-09-26 182 views
1

を使用してGet呼び出しを行っています。 URLには、underscoreというオプションのパラメータがあります。 DataContractを使用してこれらの値をclassに割り当てる必要がありますが、できません。私がそれらを別々に読んだら問題はありません。Web APIのオプションパラメータのマップC#

これは私にとって初めてのことであり、これを実行する最良の方法を模索しています。個別のパラメータのための提案が、ここで何も欠けていないことを確認したいと思っているリンクを見つけました。

コール:http://{{url}}/Host?host_name=Test&host_zipcode=123&host_id=123

ワーキング:私は、個々のパラメータとしてそれらを読めば、私はこれらのパラメータ値を読み取ることができます。

[HttpGet] 
[Route("api/Host")] 
public async Task<HostResponse> GetHostInfo([FromUri (Name = "host_name")] string hostName, [FromUri (Name = "host_zipcode")] string hostZipCode, [FromUri(Name = "host_id")] string hostId) 
{ 
} 

動作しない:私はDataContractを使用してclassを使用しようとすると、私はそれを読むことができません。

[HttpGet] 
[Route("api/Host")] 
public async Task<HostResponse> GetHostInfo([FromUri] HostInfo hostInfo) 
{ 
} 

[DataContract] 
public class HostInfo 
{ 
    [DataMember(Name = "host_name")] 
    public string HostName { get; set; } 

    [DataMember(Name = "host_zipcode")] 
    public string HostZipCode { get; set; } 

    [DataMember(Name = "host_id")] 
    public string HostId { get; set; } 
} 

私も試してみました:

public class DeliveryManagerStatus 
{ 
    [JsonProperty(PropertyName = "country")] 
    public string Country { get; set; } 

    [JsonProperty(PropertyName = "delivery_provider")] 
    public string DeliveryProvider { get; set; } 

    [JsonProperty(PropertyName = "job_id")] 
    public string JobId { get; set; } 
} 

私はクラスにこれらのプロパティを割り当てることができますどのように?

答えて

1

IModelBinderdetails)の実装を使用して解析することができます。ここでDataMemberベースの一例である(データメンバー属性からキー名を取ります):

public class DataMemberBinder : IModelBinder 
{ 
    public bool BindModel(HttpActionContext actionContext, ModelBindingContext bindingContext) 
    { 
     var props = bindingContext.ModelType.GetProperties(); 
     var result = Activator.CreateInstance(bindingContext.ModelType); 
     foreach (var property in props) 
     { 
      try 
      { 
       var attributes = property.GetCustomAttributes(typeof(DataMemberAttribute), true); 
       var key = attributes.Length > 0 
        ? ((DataMemberAttribute)attributes[0]).Name 
        : property.Name; 
       if (bindingContext.ValueProvider.ContainsPrefix(key)) 
       { 
        var value = bindingContext.ValueProvider.GetValue(key).ConvertTo(property.PropertyType); 
        property.SetValue(result, value); 
       } 
      } 
      catch 
      { 
       // log that property can't be set or throw an exception 
      } 
     } 
     bindingContext.Model = result; 
     return true; 
    } 
} 

と利用

public async Task<HostResponse> GetHostInfo([FromUri(BinderType = typeof(DataMemberBinder))] HostInfo hostInfo) 

をクイック検索では、私は、任意のAttributeBasedバインダーは試してみて、あなたがする場合は共有見つけることができませんでしたそれを見つける

+0

これは動作します。ありがとうございました。 – CSharper

0

あなたのHostInfoクラスがにあなたの呼び出しを変更する使い方:

http://{{url}}/Host?hostInfo.host_name=Test&hostInfo.host_zipcode=123&hostInfo.host_id=123

クエリ文字列の長さに制限があるため、可能であれば複雑な型を受け入れるようにルートを変更することをお勧めします。

関連する問題