【问题标题】:Sitecore WFFM checkbox values on Create Item创建项目上的 Sitecore WFFM 复选框值
【发布时间】:2015-06-12 04:38:31
【问题描述】:

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

【问题讨论】:

    标签: sitecore


    【解决方案1】:

    我还没有机会对此进行测试,但理论上,您可以创建一个继承自 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)));
        }
    }
    

    【讨论】:

    • 谢谢!我认为这会起作用,但我使用的是 MVC,所以我需要对该代码进行一些更改。我在选择checkedItems 时遇到了一些问题。如果您对如何为 MVC 重写它有任何建议,我将不胜感激!
    • @JasonDavidson,我添加了 MVC 版本。让我知道这是否适合您。
    • 好的,差不多了。 2 件事: Sitecore.Forms.Mvc.Data.TypeConverters 不存在。应该是 TypeProviders 吗?当我构建它时,出现以下错误: Sitecore.Forms.Mvc.Models.Fields.CheckBoxListField 不包含采用 0 个参数的构造函数。
    • 您应该能够添加一个如上更新的构造函数。至于TypeConverters,我从 Sitecore 8 dll 中获取了 using 语句。您也许可以安全地删除 using 语句。如果没有,请告诉我您使用的是哪个版本的 Sitecore,我会得到相应的更新。
    • 这正是我所做的并且它正在工作!非常感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多