我正在使用Sitecore 6.6,我有一个带有自定义参数模板的Sublayout项目。param模板有通常的General部分(占位符和数据源字段)和自定义的"Lock“部分,其中只有一个复选框字段。我在复选框中添加了一个自定义字段验证器,这是为了确保如果勾选了该框,就会提供一个DataSource。在我的验证器实现中,我继承了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实现中进行验证,以便在Content中提供反馈,并在验证失败时防止项保存。那么,如何在DataSource实现中获得StandardValidator字段的值呢?
发布于 2016-02-17 10:41:39
我终于想出来了。自定义验证器类可以继承StandardValidator类,但是调用自定义类的Sitecore项必须是ItemValidator,而不是FieldValidator。否则,就无法访问数据源字段。ItemValidator的缺点是需要将其添加到使用参数模板的子布局的每个项中,然后筛选出没有参数模板的呈现/子布局。
使用下面的行获得所有呈现的参考资料(来自塞特奥尔攀登者的答案)
var renderingRefs = GetItem().Visualization.GetRenderings(Sitecore.Context.Device, false);然后,您需要筛选出不相关的呈现--例如,将它们与使用param模板的项GUID或临时or列表相匹配。过滤掉不相关的呈现后,按如下方式访问DataSource:
var dataSource = myRendering.Settings.DataSource;另外,塞托雷刚刚回到我身边,基本上证实了我上面说的话。以下是他们的回应
呈现的参数不是存储在内容树中的特定项中,而是存储在具有此呈现的项的__renderings字段中。因此,为了检查DataSource参数的值,您应该为内容项创建一个验证器,并使用以下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
}发布于 2016-02-16 11:16:29
您可以使用下面的代码获取项目的数据源,我没有在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
}https://stackoverflow.com/questions/35430925
复制相似问题