在验证器实现中获取子布局的数据源

本文关键字:布局 数据源 获取 验证 实现 | 更新日期: 2023-09-27 18:34:51

我使用的是 Sitecore 6.6,并且我有一个带有自定义参数模板的子布局项目。参数模板具有通常的常规部分(占位符和数据源字段(和一个自定义"锁定"部分,该部分只有一个复选框字段。我在复选框上添加了一个自定义字段验证器,这是为了确保如果勾选该框 - 提供数据源。在我的验证器实现中,我继承了 StandardValidator 类,我可以用这个检查复选框的值

var currentItem = GetItem();
currentItem.Fields["Lock"].Value

以及通过此参数

ControlValidationValue

但是,我找不到访问数据源字段的方法。我找到的所有指南都使用以下代码获取它,但这适用于继承 Web.UI.UserControl 类(渲染控制器(的类

if(Parent is Sublayout)
    _dataSource = Sitecore.Context.Database.GetItem(((Sublayout)Parent).DataSource);

我需要在 StandardValidator 实现中进行验证,以便在内容编辑器中提供反馈,并在验证失败时防止项目保存。那么,如何在标准验证器实现中获取数据源字段的值呢?

在验证器实现中获取子布局的数据源

您可以使用以下代码获取项目的数据源,我没有在标准验证器中进行测试,但我想它会起作用

public static class ItemExtensions
{
    public static RenderingReference[] GetRenderingReferences(this Item i)
    {
        if (i == null)
        {
            return new RenderingReference[0];
        }
        return i.Visualization.GetRenderings(Sitecore.Context.Device, false);
    }
    public static List<Item> GetDataSourceItems(this Item i)
    {
        List<Item> list = new List<Item>();
        foreach (RenderingReference reference in i.GetRenderingReferences())
        {
            Item dataSourceItem = reference.GetDataSourceItem();
            if (dataSourceItem != null)
            {
                list.Add(dataSourceItem);
            }
        }
        return list;
    }
    public static Item GetDataSourceItem(this RenderingReference reference)
    {
        if (reference != null)
        {
            return GetDataSourceItem(reference.Settings.DataSource, reference.Database);
        }
        return null;
    }
    private static Item GetDataSourceItem(string id, Database db)
    {
        Guid itemId;
        return Guid.TryParse(id, out itemId)
                                ? db.GetItem(new ID(itemId))
                                : db.GetItem(id);
    }
}

在验证器类中,您将使用:

foreach (Item dataSourceItem in GetItem().GetDataSourceItems())
{ 
  //your code
}

我终于想通了。自定义验证程序类可以继承标准验证程序类,但调用自定义类的 Sitecore 验证程序项必须是 ItemValidator,而不是字段验证程序。否则,无法访问数据源字段。ItemValidator 的缺点是您需要将其添加到使用带有参数模板的子布局的每个项目中,然后过滤掉没有参数模板的渲染/子布局。

使用以下行获取所有渲染引用(来自 Sitecore Climber 的答案(

var renderingRefs = GetItem().Visualization.GetRenderings(Sitecore.Context.Device, false);

然后,您需要过滤掉不相关的渲染 - 例如,将它们与使用参数模板的项目 GUID 或模板 ID 列表进行匹配。过滤掉不相关的渲染后,请按如下方式访问数据源:

var dataSource = myRendering.Settings.DataSource;

此外,Sitecore 刚刚回复了我,基本上证实了我上面所说的内容。以下是他们的回应

呈现的参数不存储在内容树中的特定项目中,而是存储在具有此呈现的项的__renderings字段中。 因此,为了检查数据源参数的值,您应该为内容项创建一个验证程序,并使用以下 API 获取呈现及其数据源:

    foreach (var rendering in item.Visualization.GetRenderings(
        new DeviceItem(master.GetItem("{FE5D7FDF-89C0-4D99-9AA3-B5FBD009C9F3}")), //get correct device item here
        false))
    {
        if(rendering.RenderingID == new ID("some rendering ID"))
            //do something with rendering.Settings.DataSource here
    }