C# Sitecore分组投递列表
我有两个用于模板的droplist字段。在内容编辑器中,我希望第二个droplist的值依赖于第一个droplist。也就是说,类似于国家/州控制。有什么方法可以做到这一点吗?这两种方法都不能提供此功能。您需要创建一个自定义字段并实现它 编辑: 下面是我在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
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