首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在验证器实现中获取Sublayout的DataSource

在验证器实现中获取Sublayout的DataSource
EN

Stack Overflow用户
提问于 2016-02-16 11:08:55
回答 2查看 323关注 0票数 0

我正在使用Sitecore 6.6,我有一个带有自定义参数模板的Sublayout项目。param模板有通常的General部分(占位符和数据源字段)和自定义的"Lock“部分,其中只有一个复选框字段。我在复选框中添加了一个自定义字段验证器,这是为了确保如果勾选了该框,就会提供一个DataSource。在我的验证器实现中,我继承了StandardValidator类,我可以用以下方法检查复选框的值

代码语言:javascript
复制
var currentItem = GetItem();
currentItem.Fields["Lock"].Value

以及通过这个参数

代码语言:javascript
复制
ControlValidationValue

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

代码语言:javascript
复制
if(Parent is Sublayout)
    _dataSource = Sitecore.Context.Database.GetItem(((Sublayout)Parent).DataSource);

我需要在StandardValidator实现中进行验证,以便在Content中提供反馈,并在验证失败时防止项保存。那么,如何在DataSource实现中获得StandardValidator字段的值呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-02-17 10:41:39

我终于想出来了。自定义验证器类可以继承StandardValidator类,但是调用自定义类的Sitecore项必须是ItemValidator,而不是FieldValidator。否则,就无法访问数据源字段。ItemValidator的缺点是需要将其添加到使用参数模板的子布局的每个项中,然后筛选出没有参数模板的呈现/子布局。

使用下面的行获得所有呈现的参考资料(来自塞特奥尔攀登者的答案)

代码语言:javascript
复制
var renderingRefs = GetItem().Visualization.GetRenderings(Sitecore.Context.Device, false);

然后,您需要筛选出不相关的呈现--例如,将它们与使用param模板的项GUID或临时or列表相匹配。过滤掉不相关的呈现后,按如下方式访问DataSource:

代码语言:javascript
复制
var dataSource = myRendering.Settings.DataSource;

另外,塞托雷刚刚回到我身边,基本上证实了我上面说的话。以下是他们的回应

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

代码语言:javascript
复制
    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
    }
票数 0
EN

Stack Overflow用户

发布于 2016-02-16 11:16:29

您可以使用下面的代码获取项目的数据源,我没有在standardValidator中进行测试,但我想它会工作的

代码语言:javascript
复制
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);
    }
}

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

代码语言:javascript
复制
foreach (Item dataSourceItem in GetItem().GetDataSourceItems())
{ 
  //your code
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35430925

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档