Sitecore MVC 确保在体验编辑器中可选择空占位符

Sitecore MVC Ensure empty placeholder is selectable in experience editor

Sitecore MVC 中的占位符是否有一些技巧来确保它们在 页面编辑器 体验编辑器中始终可选择,即使它们不包含任何渲染?我的控制器渲染在 cshtml 视图中声明占位符如下:

<div>
  <!-- some html markup and fields rendered here --> 
  @Html.Sitecore().Placeholder("my-component-placeholder")
</div>

要确保占位符可见性和可选择性,您需要确保以下内容:

  1. Sitecore 中存在占位符设置项,与 cshtml 呈现中声明的正确 Placeholder Key 匹配。
  2. 占位符设置项已选中 Editable 设置。
  3. 页面中的 CSS 并未阻止占位符可见。

如果您使用某种动态占位符键,则有一个设置可以控制没有设置的空占位符是否可编辑。它位于 Sitecore.ExperienceEditor.config.

WebEdit.PlaceholdersEditableWithoutSettings

默认值为假。如果设置为 true,可以编辑空占位符:

<configuration xmlns:patch="http://www.sitecore.net/xmlconfig/">
    <sitecore>
        <settings>
            <setting name="WebEdit.PlaceholdersEditableWithoutSettings">
                <patch:attribute name="value">true</patch:attribute>
            </setting>
        </settings>
    </sitecore>
</configuration>

通过设置Query.MaxItems解决:

<setting name="Query.MaxItems">
  <patch:attribute name="value">1000</patch:attribute>
</setting>

解释:
在大型项目中,您可能有很多占位符(超过 260 个,这是 Sitecore 查询 API 一次读取的默认项目数量)。

Sitecore 团队设置了限制,但占位符缓存未修复,仍然只读取项目一次,因此跳过了由于限制而未添加到缓存中的占位符。

这是从反射器中获取的缓存管理器代码:

public virtual void Reload()
{
  lock (FieldRelatedItemCache.Lock)
  {
    this.itemIDs = new SafeDictionary<string, ID>();
    Item[] local_1 = this.Database.SelectItems(string.Format("{0}//*[@@templateid = '{1}']", (object) this.ItemRoot.Paths.FullPath, (object) this.ItemTemplate));
    if (local_1 == null)
      return;
    foreach (Item item_0 in local_1)
    {
      string local_3 = item_0[this.FieldKey];
      if (!string.IsNullOrEmpty(local_3) && !this.itemIDs.ContainsKey(this.GetCacheKey(local_3)))
        this.Add(local_3, item_0);
    }
  }
}