我在网络表单中使用“创建项目”保存操作。我有一个复选框列表,指向包含类别项的文件夹。这将映射到项目模板上的Multilist字段,该字段将在用户提交表单时创建。但它传递的是复选框文本,而不是值,因此创建的每个新项目的多列表中都包含错误数据。有谁知道如何设置复选框列表来传递值?我有点惊讶它首先这样做。
答案 0 :(得分:0)
我没有机会对此进行测试,但从理论上讲,您可以创建一个继承自CheckboxList
的新字段类型,让我们称之为CheckboxListPipedValues
。代码看起来像这样:
using System.ComponentModel;
using System.Linq;
using System.Text;
using Sitecore.Form.Core.Controls.Data;
using Sitecore.Form.Web.UI.Controls;
public class CheckboxListPipedValues : Sitecore.Form.Web.UI.Controls.CheckboxList
{
[Browsable(false)]
public override ControlResult Result
{
get
{
StringBuilder stringBuilder1 = new StringBuilder();
var checkedItems = this.InnerListControl.Items.Where(a => a.Selected).ToList();
var values = string.Join("|", checkedItems.Select(c => c.Value));
foreach (var item in checkedItems)
{
stringBuilder1.AppendFormat("{0}, ", item.Text);
}
return new ControlResult(this.ControlName, values, stringBuilder1.ToString(0, (stringBuilder1.Length > 0 ? stringBuilder1.Length - 2 : 0)));
}
}
}
在Sitecore中,只需转到/sitecore/system/Modules/Web Forms for Marketers/Settings/Field Types/List Types/Checkbox List
并复制该项目即可。然后将程序集和类更改为新控件。更改表单以使用新字段,并确保正确映射值。现在,值的输出应该是一个管道分隔的值列表,它应该与多列表字段很好地配合。
修改强>
对于MVC,它是相同的过程,但您需要更新字段类型项中的MVC Type
以指向您的新类。 MVC的代码应如下所示:
using Sitecore.Data;
using Sitecore.Data.Items;
using Sitecore.Form.Core.Controls.Data;
using Sitecore.Forms.Core.Data;
using Sitecore.Forms.Mvc.Data.TypeConverters;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Text;
using System.Web.Mvc;
public class CheckBoxListPipedField : CheckBoxListField
{
public CheckBoxListPipedField(Item item) : base(item)
{
}
public override ControlResult GetResult()
{
var values = new List<string>();
StringBuilder stringBuilder1 = new StringBuilder();
if (this.Items != null)
{
foreach (SelectListItem selectListItem in
from item in this.Items
where item.Selected
select item)
{
values.Add(selectListItem.Value);
stringBuilder1.AppendFormat("{0}, ", selectListItem.Text);
}
}
var results = string.Join("|", values);
return new ControlResult(base.ID.ToString(), base.Title, results, stringBuilder1.ToString(0, (stringBuilder1.Length > 0 ? stringBuilder1.Length - 2 : 0)));
}
}