我在Sitecore中有一个项目,其中包含一个内容部分,它是一个清单。此清单包含我已输入Sitecore的多个Active Directory组的名称。
当项目加载时,我试图遍历清单中的所有复选框以查看它是否被选中。
在上一篇文章的帮助下,我能够通过使用以下代码获取每个复选框旁边列出的名称(您还可以看到我尝试使用的注释掉的代码,以获取他的值复选框。):
Dim ADCheckList As Sitecore.Data.Fields.MultilistField = Sitecore.Context.Item.Fields("ADGroupAccess")
If ADCheckList IsNot Nothing Then
Dim i As Integer = 0
For i = 0 To ADCheckList.Count - 1
If IsInGroup(ADCheckList.GetItems(i).Fields("name").Value.ToString) Then
Response.Write("User in group. Now let's see if the group is checked.")
''' Trying to see if checkbox is checked or not.
''' Dim isChecked = DirectCast(ADCheckList.GetItems(i).Fields("name").Section, Boolean)
End If
Next
End IF
如何获取复选框的布尔值?
答案 0 :(得分:2)
字段类型仅存储您选择的项目的ID(作为管道分隔列表),它不存储整个可能性列表。
如果您查看从中创建项目的Template
,您将看到该字段的datasource
。这将是项目的路径,即/sitecore/content/home/myfolderofthings
此项目的子项将是您在checklist
中看到的选项。
例如,您可以遍历数据源位置中的项目,获取其item.ID
属性,并查看是否ADCheckList.Items.Contains(item.ID)
(或类似的东西)获取布尔值。
答案 1 :(得分:1)
Stephen的回答正确地指出checklist
字段仅存储所选ID的管道分隔列表,您可以通过在内容编辑器中查看原始值或Sitecore Rocks来看到这一点。
我已经包含了一些示例代码,这些代码具有获取清单中显示的所有项目列表的方法以及仅检索所选项目的方法。我希望这会有所帮助。
using System;
using System.Collections.Generic;
using Sitecore.Data.Fields;
using Sitecore.Data.Items;
namespace Cms.Website.layouts
{
public partial class CheckList_SO : System.Web.UI.UserControl
{
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
var contextItem = Sitecore.Context.Item;
const string checkListFieldName = "List";
SelectedItems.DataSource = contextItem.SelectedItemsInChecklist(checkListFieldName);
SelectedItems.DataBind();
FullItemList.DataSource = contextItem.AllItemsInChecklist(checkListFieldName);
FullItemList.DataBind();
}
}
}
public static class ItemExtensions
{
private static readonly Item[] EmptyItemArray = new Item[] { };
public static IEnumerable<Item> AllItemsInChecklist(this Item item, string checkListFieldName)
{
var fieldItem = item.Template.GetField(checkListFieldName);
if (fieldItem != null)
{
var listSource = fieldItem.Source;
if (!string.IsNullOrEmpty(listSource))
{
var sourceRoot = Sitecore.Context.Database.GetItem(listSource);
if (sourceRoot != null)
{
return sourceRoot.Children.ToArray();
}
}
}
return EmptyItemArray;
}
public static IEnumerable<Item> SelectedItemsInChecklist(this Item item, string checkListFieldName)
{
MultilistField checklist = item.Fields[checkListFieldName];
return checklist != null ? checklist.GetItems() : EmptyItemArray;
}
}
}