Получить логическое значение каждого элемента CheckList из элемента содержимого в Sitecore

У меня есть элемент в Sitecore, который содержит раздел контента, который представляет собой контрольный список. Этот контрольный список содержит имена нескольких групп Active Directory, которые я ввел в Sitecore.

Когда элемент загружается, я пытаюсь перебрать все флажки, которые есть в контрольном списке, чтобы увидеть, выбран ли он.

С помощью предыдущего поста я смог получить имена, перечисленные рядом с каждым флажком, используя следующий код (Вы также можете увидеть закомментированный код, который я пытался использовать для получения значения флажка).:

    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

Как я могу получить логическое значение флажка?

2 ответа

Решение

Тип поля хранит только идентификаторы выбранных вами элементов (в виде списка с разделителями), но не весь список возможностей.

Если вы посмотрите на Template что элемент создан из вас, вы увидите datasource поля. Это будет путь к элементу, т.е. /sitecore/content/home/myfolderofthings дети этого элемента будут варианты, которые вы видите в checklist,

Вы можете, например, пройтись по элементам в расположении источника данных, получить их item.ID собственности и посмотреть, если ADCheckList.Items.Contains(item.ID) (или что-то подобное), чтобы получить логическое значение.

Ответ Стивена правильно указал, что checklist В этом поле хранится только список выбранных идентификаторов, разделенных каналом. Это можно увидеть, просмотрев необработанные значения в редакторе содержимого или в 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;
        }
    }
}
Другие вопросы по тегам