2015-06-15 39 views
0

我有一個使用自動查詢並具有DTO它看起來像這樣覆蓋字段名反序列化在ServiceStack

[DataContract(Name = "list_item", Namespace = "")] 
public class ListItem 
{ 
    [DataMember(Name = "list_id",)] 
    public String ListId { get; set; } 
    [DataMember(Name = "first_name")] 
    public String FirstName { get; set; } 

}

當我使用自動查詢無空格它返回正確結果的響應服務,但用空格自動查詢不起作用 http://localhost/search?listid=12345

在apphost.cs添加以下代碼

private void ConfigSerializer(Container container) 
    {      
     JsConfig.PropertyConvention = PropertyConvention.Lenient; 
     JsConfig.EmitLowercaseUnderscoreNames = true; 

}

但是當我使用下劃線時仍然無法得到結果。 我錯過了什麼?

回答

0

AutoQuery test顯示自動查詢支持請求DTO有如圖的這種自動查詢服務自定義別名域:

[DataContract] 
[Route("/rockstars")] 
public class QueryRockstars : QueryBase<Rockstar> 
{ 
    [DataMember(Name = "first_name")] 
    public string FirstName { get; set; } 
} 

可與該測試被稱爲:

var request = new QueryRockstars { FirstName = "Jimi" }; 

//QueryString used: 
Assert.That(request.ToGetUrl(), 
    Is.EqualTo("/rockstars?first_name=Jimi")); 

var response = client.Get(request); 

Assert.That(response.Results.Count, Is.EqualTo(1)); 
Assert.That(response.Results[0].FirstName, Is.EqualTo("Jimi")); 

ServiceStack也已更新查看任何匹配的基礎表上的任何別名,以便現在可以在查詢表上使用字段約定,例如:

[Route("/search")] 
public class QueryPerson : QueryBase<Person> {} 

[DataContract] 
public class Person 
{ 
    [DataMember] 
    public int Id { get; set; } 

    [DataMember(Name = "first_name")] 
    public string FirstName { get; set; } 

    [DataMember] 
    public string LastName { get; set; } 
} 

var response = "http://example.org/search" 
    .AddQueryParam("first_name", "Jimi") 
    .GetJsonFromUrl() 
    .FromJson<QueryResponse<Person>>(); 

response.PrintDump(); 

它還支持使用JsConfig.EmitLowercaseUnderscoreNames慣例,e.g隱含映射:

JsConfig.EmitLowercaseUnderscoreNames = true; 

var response = "http://example.org/search" 
    .AddQueryParam("last_name", "Hendrix") 
    .GetJsonFromUrl() 
    .FromJson<QueryResponse<Person>>(); 

這些變化都可以從v4.0.41 +這就是現在available on MyGet