考虑模板:
公司
Company
模板在两个字段上均设置了标准值。如果我们得到一个Company
项并使用Glass保存它而不作任何更改,则Logo
字段将不再使用标准值。 (Company Name
字段保持不变。)看来,问题在于
Glass.Mapper.Sc.DataMappers.SitecoreFieldImageMapper
序列化该字段的值的方式与Sitecore不同。尝试保存时,它认为这是对字段的更改,不再使用标准值。标准值:
<image mediaid="{GUID}" />
玻璃产生的值(value):
<image height="64" width="64" mediaid="{GUID}" alt="Alt text" />
有没有办法让Glass产生与Sitecore相同的输出?
最佳答案
我认为这个问题在某种程度上是SitecoreFieldImageMapper将ImageField映射到Image的。为了获得Height,Width和Alt,使用了公共(public)属性。如果我们通过反射器查看它们,我们将看到它的值不直接来自字段:
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);
}
}
如果field不包含值(例如,“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属性,一切都会好起来的。但是Width和Height可能存在问题,因为它们不能为Null,并且我不确定GlassMapper如何处理尚未设置的Width和Height的图像。