在umbraco

时间:2016-03-30 21:31:43

标签: c# json serialization umbraco

我正在编写一个api,用于我公司正在编写的自定义应用程序。部分内容涉及以JSON格式发布已发布的内容。当我尝试直接序列化ipublishedcontent时,它显然会尝试序列化我根本不需要的所有umbraco数据和关系(实际上它会因堆栈溢出而失败)。有没有办法从内容项中获取自定义属性而不指定字段?

我正在使用webapi并将其传递给自身序列化,我正在使用动态来手动指定字段。我最初选择的产品类型来自modelsbuilder。我的代码目前看起来有点像这样:

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
    });
}

在我看来应该有一个简单的方法来做到这一点,而不必创建一个只有我想要的字段的动态,但我无法解决它。我只是不想每次umbraco中的文档类型发生变化时都要更改我的代码!

2 个答案:

答案 0 :(得分:0)

您可以使用Ditto将数据映射到对象中。

创建一个对象,其属性与字段的别名匹配(不区分大小写)

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

然后使用.As

映射单个或一组IPublishedContent对象
return allProducts.As<Product>();

您可以使用UmbracoProperty属性来指定别名,如果它与您的json不同,或使用JsonProperty属性更改序列化上的名称。

答案 1 :(得分:0)

看一下MemberListView中的代码 - 它在检索成员时做了类似的事情,而不事先知道MemberType上的属性是什么:

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使用SearchResultAutoMapper列表转换为此内容,但您可以轻松地从IPublishedContent映射它。