我正在构建一个扩展BaseUserControl的复杂WFFM用户控件。此控件具有多个字段,这些字段根据某些业务逻辑进行预填充。其中一个字段应该是一个下拉列表,显示一系列Sitecore项目的值。以下是我的ListField属性的定义:
private string myListField;
[VisualProperty("My List Field:", 100),
VisualCategory("Appearance"), VisualFieldType(typeof(ListField))]
public string MyListField{
get { return myListField; }
set { myListField= value; }
}
当我调试它时,titleFieldList的内容是一个字符串,其中包含以URL编码格式的以下XML:
%3Cquery%20吨%3D%22root%22%20vf%3D%22__ID%22%20tf%3D%22Value%22%3E%3Cvalue%3E%7B814FC177-2750-48D6-B7B7-4EE87012C637%7D%3C% 2Fvalue%3E%3C%2Fquery%3E
,解码,是:
<query t="root" vf="__ID" tf="Value">
<value>{814FC177-2750-48D6-B7B7-4EE87012C637}</value>
</query>
我理解这个XML的含义。它表示ID为Guid的项目的所有子项应该用于填充我的列表,使用模板字段“__ID”表示值,模板字段“value”表示文本。 有人可以帮助我理解我应该做什么来绑定一个asp:DropDownList到这个?这是一个已经序列化和编码的特定sitecore对象吗? 是否有可以处理此问题的sc:控件?
谢谢!
**编辑**
所以我尝试了以下代码
string encodedQuery = TitleFieldList;
string query = HttpUtility.UrlDecode(encodedQuery);
XDocument xmlQuery = XDocument.Parse(query);
if (xmlQuery.Element("query") != null)
{
Dictionary<string, string> nodesDictionary = new Dictionary<string, string>();
string root = xmlQuery.Element("query").Element("value").Value;
string value = xmlQuery.Element("query").Attribute("vf").Value;
string text = xmlQuery.Element("query").Attribute("tf").Value;
Item rootItem = SitecoreUtility.GetItemWithoutSecurity(new ID(root));
ChildList childList = rootItem.GetChildren();
foreach (Item child in childList)
{
string theValue = (value == "__ID") ? child.ID.ToString() : child.Fields[value].ToString();
string theText = child.Fields[text].ToString();
nodesDictionary.Add(theText, theValue);
}
titleDropDownList.DataSource = nodesDictionary;
titleDropDownList.DataTextField = "key";
titleDropDownList.DataValueField = "value";
titleDropDownList.DataBind();
}
它有效。下拉列表中填充了来自编辑器中选择的字段的正确数据。我简直无法相信没有更简单的方法来做到这一点。另外我应该如何尊重MultipleSelectedValueField和EmptyChoiceField呢?
答案 0 :(得分:2)
尝试更改属性的返回类型并添加属性TypeConverter。 TypeConverter中指定的类型负责将原始字符串值转换为属性的返回类型。
ListItemCollectionConverter - 是WFFM提供的转换器
[VisualProperty("My List Field:", 100)]
[VisualCategory("Appearance")]
[VisualFieldType(typeof(ListField))]
[TypeConverter(typeof(Sitecore.Form.Web.UI.Controls.ListItemCollectionConverter.ListItemCollectionConverter))]
public Sitecore.Form.Web.UI.Controls.ListItemCollection MyListField{
get { return myListField; }
set { myListField= value; }
}