考虑模板:

公司

  • 徽标(图像字段)
  • 公司名称(文本字段)
  • 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的图像。

    10-06 15:56