2016-03-30 27 views
1

Şu anda şirketimin yazdığı özel bir uygulama için bir API yazmaktayım. Bunun bir kısmı, yayınlanan içeriği JSON biçiminde almayı içerir. Ipublishedcontent'i doğrudan seri hale getirmeyi denediğimde, açıkça gerek duymadığım tüm umbraco verilerini ve ilişkilerini serileştirmeye çalışır (aslında bir yığın taşmasıyla başarısız olur). Alanları belirten bir içerik öğesinden yalnızca özel özellikleri almanın bir yolu var mı?Yayınlanan içeriği umbraco serisinde yayınlama

Webapi kullanıyorum ve kendisini serileştirmek için nesneleri aktarıyorum ve alanları manuel olarak belirtmek için dinamik kullanıyorum. Başlangıçta seçtiğim ürün tipi, model oluşturucudan. Kodum şu anda biraz şuna benzer:

public object Get(string keywords = "") 
{ 
    // Get Data from Umbraco 
    var allProducts = Umbraco.TypedContent(1100).Children.Select(x => new Product(x)); 
    if (keywords != "") 
    { 
     allProducts = allProducts.Where(x => x.Name.Contains(keywords)); 
    } 


    return allProducts.Select(x => new 
    { 
     id = x.Id, 
     name = x.Name, 
     price = x.Price 
    }); 
} 

Orada istediğim sadece alanları ile dinamik oluşturmak zorunda kalmadan bunu yapmanın basit bir yolu olmalı ama bunu dışarı çalışamaz geliyor bana . Umbraco'daki belge tipi her değiştiğinde kodumu değiştirmek zorunda kalmak istemiyorum!

cevap

0

Verilerinizi bir nesneye eşlemek için Ditto kullanabilirsiniz.

Sen UmbracoProperty kullanabilirsiniz

public class Product{ 
    public int id {get;set;} 
    public string name {get;set;} 
    public string price {get;set;} 
} 

Sonra .As

return allProducts.As<Product>(); 

kullanarak IPublishedContent nesneleri tek veya koleksiyon map (Hassas) Alanlarınızın takma 's maç özelliklere sahip bir nesne oluşturun json'unuz için gerekenden farklıysa veya serileştirmeyle ilgili adı değiştirmek için JsonProperty özniteliğini kullanıp, takma ad belirtin.

+0

Belge türünde bir alan her değiştiğinde bir sınıf oluşturmamı gerektirmez mi? Buradaki nokta, belge tipi her değiştiğinde projeyi yeniden derlemek zorunda kalmadan belgenin herhangi bir yararlı alanını dinamik olarak çıkarmaktır. –

+0

7.4 ile paketlenmiş Model Oluşturucuyu kullanabilirsiniz. Her belge türü için otomatik olarak sınıf oluşturur. –

+0

Başka bir seçenek IPublishedContent özellik koleksiyonu arasında döngü yapmak ve diğer adlara + değerlerini bir sözlüğe eklemek olacaktır. Json'da bir nesne gibi çıktılar. –

0

MemberListView kod bir göz atın - bu uyeturu üzerinde özellikleri ne olacağını önceden bilmeden Üyeler alınırken benzer bir şey yapar: Örneğin

https://github.com/robertjf/umbMemberListView/blob/master/MemberListView/Models/MemberListItem.cs

:

[DataContract(Name = "content", Namespace = "")] 
public class MemberListItem 
{ 
    // The following properties are "known" - common to all IPublishedContent 
    [DataMember(Name = "id")] 
    public int Id { get; set; } 

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

    [DataMember(Name = "contentType")] 
    public IContentType ContentType { get; set; } 

    // This one contains a list of all other custom properties. 
    private Dictionary<string, string> properties; 
    [DataMember(Name = "properties")] 
    public IDictionary<string, string> Properties 
    { 
     get 
     { 
      if (properties == null) 
       properties = new Dictionary<string, string>(); 
      return properties; 
     } 
    } 
} 

MemberListView, buna listesini AutoMapper10 kullanarak dönüştürür, ancak IPublishedContent'ten kolayca eşleştirebilirsiniz.