考虑模板:
公司
>徽标(图像字段)
>公司名称(文本字段)
公司模板在两个字段上都设置了标准值.如果我们获取公司项目并使用Glass保存而不进行任何更改,则logo字段不再使用标准值. (公司名称字段未触及.)
看起来,问题是Glass.Mapper.Sc.DataMappers.SitecoreFieldImageMapper以不同于Sitecore的方式序列化该字段的值.当它试图保存时,它认为这是对字段的更改,不再使用标准值.
标准值:
<image mediaid="{GUID}" />
玻璃生成的价值:
<image height="64" width="64" mediaid="{GUID}" alt="Alt text" />
解决方法
我认为问题在于
SitecoreFieldImageMapper如何将ImageField映射到Image.为了获得高度,宽度和Alt使用公共属性.如果我们通过反射器查看它们,我们将看到它的值不直接来自字段:
public string Alt { get { string text = base.GetAttribute("alt"); if (text.Length == 0) { Item item = this.MediaItem; if (item != null) { MediaItem mediaItem = item; text = mediaItem.Alt; if (text.Length == 0) { text = item["Alt"]; } } } return text; } set { base.SetAttribute("alt",value); } }
如果字段不包含值(例如,对于“alt”:if(text.Length == 0)),则将从链接的MediaItem接收值.它导致在保存字段后从媒体库项添加高度,宽度和Alt.
int height = 0; int.TryParse(field.Height,out height); int width = 0; int.TryParse(field.Width,out width); img.Alt = field.Alt; img.Height = height; img.Width = width;
int height = 0; if(int.TryParse(field.GetAttribute("height"),out height)) { img.Height = height; } int width = 0; if(int.TryParse(field.GetAttribute("width"),out width)) { img.Width = width; } img.Alt = field.GetAttribute("alt");
使用Alt属性一切都应该没问题.但是宽度和高度可能存在问题,因为它们不是Nullable,我不确定GlassMapper如何处理没有设置的宽度和高度的图像.