我正在编写一个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中的文档类型发生变化时都要更改我的代码!
答案 0 :(得分:0)
您可以使用Ditto将数据映射到对象中。
创建一个对象,其属性与字段的别名匹配(不区分大小写)
public class Product{
public int id {get;set;}
public string name {get;set;}
public string price {get;set;}
}
然后使用.As
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使用SearchResult
从AutoMapper
列表转换为此内容,但您可以轻松地从IPublishedContent映射它。