Access Checklist, Multilist, Treelist, and TreelistEx fields

Abstract

How to access Checklist, Multilist, Treelist, and TreelistEx fields using the Sitecore.Data.Fields.MultilistField class.

You can access field types allowing the user to select multiple items, including Checklist, Multilist, Treelist, and TreelistEx, by using the Sitecore.Data.Fields.MultilistField class.

You can use the Sitecore.Data.Fields.MultilistField.GetItems() method to access a list of Sitecore.Data.Item.Item objects representing the items specified by the field. For example, the following C# code shows you how to iterate over the items specified in the Multilist field named related.

public ActionResult Index()
 {
     DogModel myDog;
     var dogs = new List<DogModel>();

     //Get the current page using Sitecore Item API
     var currentPage = Sitecore.Context.Item;

      //Cast to a Sitecore item
     Sitecore.Data.Items.Item myItem = (Sitecore.Data.Items.Item)currentPage;

     //Read the Multifield List
     Sitecore.Data.Fields.MultilistField multiselectField = myItem.Fields["related"];

    Sitecore.Data.Items.Item[] items = multiselectField.GetItems();

    //Iterate through each item
    if (items != null && items.Length > 0)
      {
          for (int i = 0; i < items.Length; i++)
          {
            //Allocate memory to the model
             myDog = new DogModel();

             Sitecore.Data.Items.Item dogItem = items[i];
             myDog.name = FieldRenderer.Render(dogItem, "Name");
             myDog.long_description = FieldRenderer.Render(dogItem, "LongDescription");
             myDog.breed = FieldRenderer.Render(dogItem, "Breed");

              //Get the link to the page
               var myLink = Sitecore.Links.LinkManager.GetItemUrl(dogItem);

              //Need to check and if /en is there - remove it 
               if (myLink.StartsWith("/en"))
                 //remove it
                    myLink = myLink.Substring(myLink.LastIndexOf("/Dogs"));
              myDog.uri = myLink; 

               //push to the list
                 dogs.Add(myDog); 
                }
            }
                 
           //Return the collection to the view
            return View(dogs);
        }

The individual members of the list returned by Sitecore.Data.Fields.MultilistField.GetItems() method are never Null. If a user has deleted an item without updating the references to that item, the Sitecore.Data.Fields.MultilistField.GetItems() method excludes that item from its results.

You can also use the Sitecore.Data.Fields.MultilistField class to access fields of type Droplink, Droptree, and Grouped Droplink. This approach provides you with a single programming model for all field types that store the IDs of one or more Sitecore items, and could reduce the need to update code if you change the type of the field. Because Droplink, Droptree, and Grouped Droplink do not support selection of multiple items, you should not use the Sitecore.Data.Fields.Multilist class to update these types of fields.

You can add items to a supported field type by using the Sitecore.Data.Fields.MulitlistField.Add() method, and remove items by using the Sitecore.Data.Fields.MulitlistField.Remove() method. For example, to ensure that the TreelistEx Multiselect field in the /Sitecore/Content/Home item in the Master database specifies the /Sitecore/Content/Home/Sample1 item, but does not specify the /Sitecore/Content/Home/Sample2 item:

Sitecore.Data.Database master = Sitecore.Configuration.Factory.GetDatabase("master");

Sitecore.Data.Items.Item home = master.GetItem("/sitecore/content/home");

Sitecore.Data.Items.Item sample1 = master.GetItem("/sitecore/content/home/sample1");

Sitecore.Data.Items.Item sample2 = master.GetItem("/sitecore/content/home/sample2");

Sitecore.Data.Fields.MultilistField multiselectField = home.Fields["multiselect"];

if(multiselectField.Contains(sample2.ID.ToString()) || !multiselectField.Contains(sample1.ID.ToString()))
{
    home.Editing.BeginEdit();

    if(!multiselectField.Contains(sample1.ID.ToString()))
    {
        multiselectField.Add(sample1.ID.ToString());
    }

    if(multiselectField.Contains(sample2.ID.ToString()))
    {
        multiselectField.Remove(sample2.ID.ToString());
     }

    home.Editing.EndEdit();
}