Access Checklist, Multilist, Treelist, and TreelistEx fields
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();
}