创建项目上的Sitecore WFFM复选框值

时间:2015-06-10 21:03:53

标签: sitecore

我在网络表单中使用“创建项目”保存操作。我有一个复选框列表,指向包含类别项的文件夹。这将映射到项目模板上的Multilist字段,该字段将在用户提交表单时创建。但它传递的是复选框文本,而不是值,因此创建的每个新项目的多列表中都包含错误数据。有谁知道如何设置复选框列表来传递值?我有点惊讶它首先这样做。

1 个答案:

答案 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)));
    }
}