我正在使用Glass Mapper for Umbraco。在尝试建模时,我有一个类:
[UmbracoType(AutoMap = true)]
public class ImageWithLink : BaseUmbracoItem
{
public virtual Image Image { get; set; }
public virtual ?? Link { get; set; }
public virtual string Copy { get; set; }
}
似乎没有'链接' Sitecore实现中的数据类型。我看到了这篇文章(http://bluetubeinc.com/blog/2014/6/glass-mapper-and-umbraco-7),他们使用了' RelatedLink'数据类型,但不存在(我在玻璃存储库中检查过)。
我必须自己模仿吗?
编辑:这是相关链接属性类型。
答案 0 :(得分:0)
假设Umbraco在一段时间内没有改变,你的意思是指在html锚中的链接...
我可能在这个问题上错了,但是从内存来看,Umbraco在从api返回时没有链接的概念。它作为节点ID(或列表)返回,您必须使用扩展方法从中返回URL。
就像你一样,就我在Glass代码库中看到的情况而言,它并没有明确实现一个'链接'类似于我们在Sitecore中的类型。
我的猜测是,您必须使用自定义类和Delegate功能自行滚动或使用整数映射并调用umbraco api方法。
我还猜测,该示例中的RelatedLink是映射到另一个类,它将使用UmbracoPropertyTypeMapper,类似于我们在Sitecore之间的类型,而不是'链接'就像锚。
我们应该在V4过程中再次查看umbraco我相信所以请与Mike谈谈将其添加为功能。
答案 1 :(得分:0)
我找到了一个(相当可怕的)解决方案。 Umbraco返回Json,所以我不得不反序列化它。你可以把它变成一个映射器。
[UmbracoType(AutoMap = true)]
public class BaseUmbracoItem : IUmbracoItem
{
public virtual string Links { get; set; }
public List<UmbracoLink> TypedLink
{
get
{
return JsonConvert.DeserializeObject<List<UmbracoLink>>(Links);
}
}
}
public class UmbracoLink
{
public string link { get; set; }
public string type { get; set; }
public string title { get; set; }
public bool newWindow { get; set; }
public bool isInternal { get; set; }
}
这是一个映射器版本:
public class UmbracoLinkMapper : AbstractDataMapper
{
/// <summary>
/// Initializes a new instance of the <see cref="UmbracoLinkMapper"/> class.
/// </summary>
public UmbracoLinkMapper()
{
ReadOnly = true;
}
/// <summary>
/// Maps data from the .Net property value to the CMS value
/// </summary>
/// <param name="mappingContext">The mapping context.</param>
/// <returns>The value to write</returns>
/// <exception cref="System.NotSupportedException"></exception>
public override void MapToCms(AbstractDataMappingContext mappingContext)
{
throw new NotSupportedException();
}
/// <summary>
/// Maps data from the CMS value to the .Net property value
/// </summary>
/// <param name="mappingContext">The mapping context.</param>
/// <returns>System.Object.</returns>
public override object MapToProperty(AbstractDataMappingContext mappingContext)
{
var scContext = mappingContext as UmbracoDataMappingContext;
var scConfig = Configuration as UmbracoLinkConfiguration;
var properties = scContext.Content.Properties.Where(x => x.Alias == Configuration.PropertyInfo.Name.ToLower()).ToList();
if (properties.Any())
{
var property = properties.First().Value as string;
return JsonConvert.DeserializeObject<List<UmbracoLink>>(property).First();
}
return null;
}
/// <summary>
/// Indicates that the data mapper will mapper to and from the property
/// </summary>
/// <param name="configuration">The configuration.</param>
/// <param name="context">The context.</param>
/// <returns><c>true</c> if this instance can handle the specified configuration; otherwise, <c>false</c>.</returns>
public override bool CanHandle(AbstractPropertyConfiguration configuration, Context context)
{
return configuration is UmbracoLinkConfiguration;
}
}
public class UmbracoLinkConfiguration : AbstractPropertyConfiguration
{
public bool IsLazy { get; set; }
public bool InferType { get; set; }
}
public class UmbracoLinkAttribute : AbstractPropertyAttribute
{
public bool IsLazy { get; set; }
public bool InferType { get; set; }
public override AbstractPropertyConfiguration Configure(PropertyInfo propertyInfo)
{
var config = new UmbracoLinkConfiguration { IsLazy = IsLazy, InferType = InferType };
Configure(propertyInfo, config);
return config;
}
}