2014-05-23 51 views

回答

1

我有同樣的目標,但沒有找到合適的解決方案來解析使用粘合劑而不是整個模型的確切性質,和。但是,有一種解決方案或多或少地適應我 - 它以相同的方式表現出色,但需要用屬性標記模型。我知道我有點晚了,但也許會幫助有同樣問題的人。

解決方案是將自定義TypeConverter用於所需的類型。首先,決定你想如何解析你的模型。在我的例子,我需要以某種方式解析搜索條件,所以我的複雜模型是:

[TypeConverter(typeof(OrderModelUriConverter))] // my custom type converter, which is described below 
public class OrderParameter 
{ 
    public string OrderBy { get; set; } 
    public int OrderDirection { get; set; } 
} 

public class ArticlesSearchModel 
{ 
    public OrderParameter Order { get; set; } 
    // whatever else 
} 

然後決定如何你想解析輸入。在我的情況下,我簡單地用逗號分隔值。

public class OrderParameterUriParser 
{ 
    public bool TryParse(string input, out OrderParameter result) 
    { 
     result = null; 
     if (string.IsNullOrWhiteSpace(input)) 
     { 
      return false; 
     } 
     var parts = input.Split(','); 
     result = new OrderParameter(); 
     result.OrderBy = parts[0]; 
     int orderDirection; 
     if (parts.Length > 1 && int.TryParse(parts[1], out orderDirection)) 
     { 
      result.OrderDirection = orderDirection; 
     } 
     else 
     { 
      result.OrderDirection = 0; 
     } 
     return true; 
    } 
} 

然後創建一個轉換器,它將採用查詢的一部分並使用上述規則將其轉換爲您的模型。

public class OrderModelUriConverter : TypeConverter 
{ 
    private static readonly Type StringType = typeof (string); 

    public OrderModelUriConverter() 
    { 
    } 

    public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType) 
    { 
     if (sourceType == StringType) 
     { 
      return true; 
     } 
     return base.CanConvertFrom(context, sourceType); 
    } 

    public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value) 
    { 
     var str = value as string; 
     if (str != null) 
     { 
      var parser = new OrderParameterParser() 
      OrderParameter orderParameter; 
      if (parser.TryParse(str, out orderParameter)) 
      { 
       return orderParameter; 
      } 
     } 
     return base.ConvertFrom(context, culture, value); 
    } 
} 

轉換器的用法在第一個樣本中指定。由於您正在解析URI,因此不要忘記在控制器的方法中也將[FromUri]屬性添加到您的參數中。

[HttpGet] 
public async Task<HttpResponseMessage> Search([FromUri] ArticlesSearchModel searchModel) // the type converter will be applied only to the property of the types marked with our attribute 
{ 
    // do search 
} 

此外,您還可以看看this excellent article,其中包含類似的例子還解析參數等幾個方面。