EPiServer Custom Property with Custom Settings
I was brushing up on custom properties and came across Allan Thræn’s post Custom Property: Category Drop Down. The code is simple and works great, but one thing I didn’t like is that you need to give the property the same name as the root category that you use to populate the drop down.
In EPiServer CMS 6 we now have the ability to add settings to the properties. Linus Ekström wrote a great post on how to use the new settings functionality: Settings for properties. After reading both Allan’s and Linus’ post I decided to give the EPiServer administrator the ability to choose which category should be the root category in the settings tab of the property.
Custom Property
using System; using EPiServer.Core.PropertySettings; using EPiServer.PlugIn; namespace EPiServer.Templates.Properties { [Serializable] [PageDefinitionTypePlugIn] [PropertySettings(typeof(CategoryDropDownSettings), true)] public class CategoryDropDown : EPiServer.Core.PropertyString { public override EPiServer.Core.IPropertyControl CreatePropertyControl() { return new CategoryDropDownControl(); } } }
The code is almost identical to Allan’s except for the PropertySettings attribute.
using System.Web.UI.WebControls; using EPiServer.DataAbstraction; namespace EPiServer.Templates.Properties { public class CategoryDropDownControl : EPiServer.Web.PropertyControls.PropertyTextBoxControlBase { public override bool SupportsOnPageEdit { get { return false; } } protected DropDownList ddl; public override void CreateEditControls() { ddl = new DropDownList(); CategoryDropDownSettings settings = (CategoryDropDownSettings)base.PropertyData.GetSetting(typeof(CategoryDropDownSettings)); Category main_c = Category.Find(settings.RootCategory); ddl.Items.Add(new ListItem("", "")); foreach (Category c in main_c.Categories) { ListItem li = new ListItem(c.LocalizedDescription, c.Name); li.Selected = (((string)CategoryDropDown.Value) == c.Name); ddl.Items.Add(li); } this.ApplyControlAttributes(ddl); Controls.Add(ddl); } public override void ApplyEditChanges() { SetValue(ddl.SelectedValue); } public CategoryDropDown CategoryDropDown { get { return PropertyData as CategoryDropDown; } } } }
Only difference to Allan’s code here is in the CreateEditControls method.
... CategoryDropDownSettings settings = (CategoryDropDownSettings)base.PropertyData.GetSetting(typeof(CategoryDropDownSettings)); Category main_c = Category.Find(settings.RootCategory); ...
Custom Settings
using EPiServer.Core.PropertySettings; namespace EPiServer.Templates.Properties { [PropertySettingsUI(AdminControl = typeof(CategoryDropDownSettingsUI))] public class CategoryDropDownSettings : PropertySettingsBase { public int RootCategory { get; set; } public override IPropertySettings GetDefaultValues() { return new CategoryDropDownSettings { RootCategory = 0 }; } } }
I’m setting the default rootCategory to be 0 (root).
using System.Linq; using System.Web.UI.WebControls; using EPiServer.Core; using EPiServer.Core.PropertySettings; using EPiServer.Web.WebControls; namespace EPiServer.Templates.Properties { public class CategoryDropDownSettingsUI : PropertySettingsControlBase { private InputCategoryTree _categoryTree; protected override void CreateChildControls() { base.CreateChildControls(); _categoryTree = new InputCategoryTree {ID = "CategoryTree"}; Label label = new Label { Text = "Root Category", AssociatedControlID = "CategoryTree" }; Controls.Add(label); Controls.Add(_categoryTree); } public override void LoadSettingsUI(IPropertySettings propertySettings) { EnsureChildControls(); _categoryTree.SelectedCategories = new CategoryList(new[] {((CategoryDropDownSettings)propertySettings).RootCategory}); } public override void UpdateSettings(IPropertySettings propertySettings) { EnsureChildControls(); // We only want the first selected category ((CategoryDropDownSettings)propertySettings).RootCategory = int.Parse(_categoryTree.SelectedCategories.ElementAt(0).ToString()); } } }
When we add a new property we now have the option, under custom settings, to choose the root category for our drop down.
Which gives our editors these options.
Hi Fredrik
Have you had any issues with the values not persisting between project builds? Every time i rebuild it clears the value in the custom settings
I can see that you are an expert at your field! I am launching a website soon, and your information will be very useful for me.. Thanks for all your help and wishing you all the success.