Получить логическое значение каждого элемента 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;
}
}
}