C# Sitecore分组投递列表

C# Sitecore分组投递列表,c#,asp.net,content-management-system,sitecore,sitecore6,C#,Asp.net,Content Management System,Sitecore,Sitecore6,我有两个用于模板的droplist字段。在内容编辑器中,我希望第二个droplist的值依赖于第一个droplist。也就是说,类似于国家/州控制。有什么方法可以做到这一点吗?这两种方法都不能提供此功能。您需要创建一个自定义字段并实现它 编辑: 下面是我在sitecore安装中使用的类别/子类别字段的实现 public class CategoryPicker : Control, IContentField { #region IContentField Impleme

我有两个用于模板的droplist字段。在内容编辑器中,我希望第二个droplist的值依赖于第一个droplist。也就是说,类似于国家/州控制。有什么方法可以做到这一点吗?

这两种方法都不能提供此功能。您需要创建一个自定义字段并实现它

编辑: 下面是我在sitecore安装中使用的类别/子类别字段的实现

public class CategoryPicker : Control, IContentField
    {
        #region IContentField Implementation

        public string GetValue()
        {
            return string.Format("{0}|{1}",
                                 GetInputControl<Listbox>(ControlNames.MainCategoryDropList).SelectedItem.Value,
                                 GetInputControl<Listbox>(ControlNames.SubCategoryDropList).SelectedItem.Value);

        }

        public void SetValue(string value)
        {
            Value = value;
        }

        #endregion

        #region Properties

        public string ItemId
        {
            get { return GetViewStateString("ItemID"); }
            set { SetViewStateString("ItemID", value); }
        }

        private CategoryIdPair CategoryIdPair
        {
            get
            {
                Item contextItem = GetItem(ItemId);
                if (contextItem.Fields["CategoryId"] != null)
                {
                    return CategoryFieldParser.Parse(contextItem.Fields["CategoryId"].Value);
                }
                return CategoryIdPair.Empty;
            }
        }

        public bool TrackModified
        {
            get { return GetViewStateBool("TrackModified", false); }
            set { SetViewStateBool("TrackModified", value, false); }
        }

        #endregion

        public CategoryPicker()
        {
            TrackModified = true;
        }

        protected override void OnLoad(EventArgs e)
        {
            if (!Sitecore.Context.ClientPage.IsEvent)
            {
                Controls.Clear();
                Controls.Add(CreateMainCategorySelectorControl());
                Controls.Add(CreateSubCategorySelectorControl());

                SetSelectorOnChangeEvents();
            }
            else
            {
                var mainCategorySelectorControl = GetInputControl<Listbox>(ControlNames.MainCategoryDropList);
                var subCategorySelectorControl = GetInputControl<Listbox>(ControlNames.SubCategoryDropList);
                // if value changed - set modified=true
                if (mainCategorySelectorControl.SelectedItem.Value != CategoryIdPair.CategoryId.ToString() || subCategorySelectorControl.SelectedItem.Value != CategoryIdPair.SubCategoryId.ToString())
                {
                    SetModified();
                }
            }

            base.OnLoad(e);
        }

        private void SetSelectorOnChangeEvents()
        {
            var mainCategorySelectorControl = GetInputControl<Listbox>(ControlNames.MainCategoryDropList);
            mainCategorySelectorControl.Attributes.Add("onchange",
                                                       Sitecore.Context.ClientPage.GetClientEvent(
                                                        ID + ".ReInitialiseSubCategorySelector"));
            var subCategorySelectorControl = GetInputControl<Listbox>(ControlNames.SubCategoryDropList);
            subCategorySelectorControl.Attributes.Add("onchange",
                                                      Sitecore.Context.ClientPage.GetClientEvent(
                                                        ID + ".SetSubCategoryFieldValue"));
        }

        public void ReInitialiseSubCategorySelector()
        {
            var subCategorySelectorControl = GetInputControl<Listbox>(ControlNames.SubCategoryDropList);
            InitialiseSubCategorySelectorControl(subCategorySelectorControl);
            Sitecore.Context.ClientPage.ClientResponse.Refresh(subCategorySelectorControl);
        }

        public void SetSubCategoryFieldValue()
        {
            Item contextItem = GetItem(ItemId);
            using (new SecurityDisabler())
            {
                contextItem.Editing.BeginEdit();
                contextItem.Fields["CategoryId"].Value = GetValue();
                contextItem.Editing.EndEdit();
            }   
        }

        #region Main Category Dropdown Population

        private Listbox CreateMainCategorySelectorControl()
        {
            var mainCategorySelectorControl = new Listbox
                                                {
                                                    ID = GetID(ControlNames.MainCategoryDropList),
                                                    Disabled = Disabled,
                                                    TrackModified = false
                                                };

            InitialiseMainCategorySelectorControl(mainCategorySelectorControl);

            return mainCategorySelectorControl;
        }

        private void InitialiseMainCategorySelectorControl(System.Web.UI.Control mainCategorySelectorControl)
        {
            List<Category> mainCategories = //Get main categories;

            foreach (Category category in mainCategories)
                CreateCategoryListItem(category.Description, category.CategoryId, mainCategorySelectorControl, category.CategoryId == CategoryIdPair.CategoryId);
        }

        #endregion

        #region Sub-Category Dropdown Population

        public Listbox CreateSubCategorySelectorControl()
        {
            var subCategorySelectorControl = new Listbox
                                                {
                                                    ID = GetID(ControlNames.SubCategoryDropList),
                                                    Disabled = Disabled,
                                                    TrackModified = false
                                                };

            InitialiseSubCategorySelectorControl(subCategorySelectorControl);
            subCategorySelectorControl.Value = CategoryIdPair.SubCategoryId.ToString();
            Sitecore.Context.ClientPage.ClientResponse.Refresh(subCategorySelectorControl);
            return subCategorySelectorControl;
        }

        public void InitialiseSubCategorySelectorControl(System.Web.UI.Control subCategorySelectorControl)
        {
            var mainCategorySelectorControl = GetInputControl<Listbox>(ControlNames.MainCategoryDropList);
            int mainCategorySelectedValue = Convert.ToInt32(mainCategorySelectorControl.SelectedItem.Value);

            subCategorySelectorControl.Controls.Clear();

            CreateCategoryListItem("Please select", 0, subCategorySelectorControl, false);

            List<SubCategory> subCategories = //Get all subcategories
            foreach (SubCategory subCategory in subCategories)
            {
                CreateCategoryListItem(subCategory.Description, subCategory.SubCategoryId, subCategorySelectorControl, subCategory.SubCategoryId == CategoryIdPair.SubCategoryId);
            }
        }

        #endregion

        private static void CreateCategoryListItem(string title, int value, System.Web.UI.Control control, bool selected)
        {
            var listItem = new ListItem
                            {
                                ID = GetUniqueID(ControlNames.CategoryListItem),
                                Header = title,
                                Value = value.ToString(),
                                Selected = selected
                            };

            Sitecore.Context.ClientPage.AddControl(control, listItem);
        }

        #region Helper Methods

        private T GetInputControl<T>(string controlName) where T : Control
        {
            return FindControl(GetID(controlName)) as T;
        }

        private void SetModified()
        {
            if (TrackModified)
            {
                Sitecore.Context.ClientPage.Modified = true;
            }
        }

        private static Item GetItem(string itemId)
        {
            return Sitecore.Context.ContentDatabase.GetItem(new ID(itemId));
        }

        #endregion

        #region ControlNames Nested Class

        private static class ControlNames
        {
            public const string MainCategoryDropList = "MainCategoryDropList";
            public const string SubCategoryDropList = "SubCategoryDropList";
            public const string CategoryListItem = "CategoryListItem";
        }

        #endregion
    }

    public class CategoryField : CustomField
    {
        public int CategoryId { get; set; }
        public int SubCategoryId { get; set; }

        public CategoryField(Field innerField) : base(innerField)
        {
            Assert.ArgumentNotNull(innerField, "innerField");
            var pair = CategoryFieldParser.Parse(innerField.Value);
            CategoryId = pair.CategoryId;
            SubCategoryId = pair.SubCategoryId;
        }

        public static implicit operator CategoryField(Field field)
        {
            if (field != null)
            {
                return new CategoryField(field);
            }
            return null;
        }
    }

    public class CategoryFieldParser
    {
        public static CategoryIdPair Parse(string input)
        {
            var pair = input.Split(new[] { '|' });
            return new CategoryIdPair
                    {
                        CategoryId = pair.Length > 0 ? GetIntValue(pair[0]) : CategoryIdPair.Empty.CategoryId,
                        SubCategoryId = pair.Length == 2 ? GetIntValue(pair[1]) : CategoryIdPair.Empty.SubCategoryId
                    };
        }

        private static int GetIntValue(string input)
        {
            int result;
            if (int.TryParse(input, out result))
                return result;
            return 0;
        }
    }

    public class CategoryIdPair
    {
        public int CategoryId { get; set; }
        public int SubCategoryId { get; set; }
        public static CategoryIdPair Empty
        {
            get { return new CategoryIdPair {CategoryId = 0, SubCategoryId = 0}; }
        }
    }
公共类类别识别器:控件,IContentField
{
#区域IContentField实现
公共字符串GetValue()
{
返回string.Format(“{0}{1}”,
GetInputControl(ControlNames.MainCategorHydropList)。选择EdItem.Value,
GetInputControl(ControlNames.SubCategoryDropList)。选择EdItem.Value);
}
公共void设置值(字符串值)
{
价值=价值;
}
#端区
#区域属性
公共字符串ItemId
{
获取{return GetViewStateString(“ItemID”);}
set{SetViewStateString(“ItemID”,value);}
}
私人类别空气类别空气
{
收到
{
Item contextItem=GetItem(ItemId);
if(contextItem.Fields[“CategoryId”!=null)
{
返回CategoryFieldParser.Parse(contextItem.Fields[“CategoryId”].Value);
}
返回类别IDPAIR。为空;
}
}
公共图书馆
{
获取{return GetViewStateBool(“TrackModified”,false);}
set{SetViewStateBool(“TrackModified”,value,false);}
}
#端区
公共类别识别器()
{
TrackModified=true;
}
受保护的覆盖无效加载(事件参数e)
{
如果(!Sitecore.Context.ClientPage.IsEvent)
{
控件。清除();
添加(CreateMainCategorySelectorControl());
添加(CreateSubcategory SelectorControl());
SetSelectorOnChangeEvents();
}
其他的
{
var mainCategorySelectorControl=GetInputControl(ControlNames.MainCategorHydropList);
var subcategory selectorcontrol=GetInputControl(ControlNames.subcategory-dropList);
//如果值已更改-设置已修改=真
如果(Main CategorySelectorControl.SelectedItem.Value!=CategoryIdPair.CategoryId.ToString()| |子类别SelectorControl.SelectedItem.Value!=CategoryIdPair.SubCategoryId.ToString())
{
SetModified();
}
}
基础荷载(e);
}
私有void SetSelectorOnChangeEvents()
{
var mainCategorySelectorControl=GetInputControl(ControlNames.MainCategorHydropList);
mainCategorySelectorControl.Attributes.Add(“onchange”,
Sitecore.Context.ClientPage.GetClientEvent(
ID+“.ReInitialiseSubCategorySelector”);
var subcategory selectorcontrol=GetInputControl(ControlNames.subcategory-dropList);
子类别SelectorControl.Attributes.Add(“onchange”,
Sitecore.Context.ClientPage.GetClientEvent(
ID+“.SetSubCategoryFieldValue”);
}
public void重新初始化SubcategorySelector()
{
var subcategory selectorcontrol=GetInputControl(ControlNames.subcategory-dropList);
初始化子类别选择器或控件(子类别选择器或控件);
Sitecore.Context.ClientPage.ClientResponse.Refresh(子类别选择器或控件);
}
public void SetSubCategoryFieldValue()
{
Item contextItem=GetItem(ItemId);
使用(新的SecurityDisabler())
{
contextItem.Editing.BeginEdit();
contextItem.Fields[“CategoryId”].Value=GetValue();
contextItem.Editing.EndEdit();
}   
}
#地区主要类别下降人口
私有Listbox CreateMainCategorySelectorControl()
{
var mainCategorySelectorControl=新建列表框
{
ID=GetID(ControlNames.MainCategorHydropList),
禁用=禁用,
TrackModified=false
};
初始化mainCategorySelectorControl(mainCategorySelectorControl);
返回主类别选择或控制;
}
私有void InitialiseMainCategorySelectorControl(System.Web.UI.Control mainCategorySelectorControl)
{
List mainCategories=//获取主要类别;
foreach(主要类别中的类别)
CreateCategoryListItem(category.Description、category.CategoryId、mainCategorySelectorControl、category.CategoryId==CategoryIdPair.CategoryId);
}
#端区
#区域子类别下拉人口
公共列表框CreateSubcategory Selector控件()
{
变量子类别选择器控件=新建列表框
{
ID=GetID(ControlNames.SubcategorityDropList),
禁用=禁用,
TrackModified=false
};
初始化子类别SELEC