0

我正在尝试构建一个自定义的Typeahead表单元素。我已经预定义了多个数据集来从中提取自动完成建议。当用户将我的字段添加到表单时,我希望他们能够通过复选框选择这些数据集中的一个或多个。

Orchard 似乎没有开箱即用的任何形状。通过查看中的其他表单元素Orchard.DynamicForms和中定义的 SelectList 形状Orchard.Forms.Shapes.EditorShapes.cs,我能够将驱动程序的工作代码拼凑在一起:

public class TypeaheadFieldElementDriver : FormsElementDriver<TypeaheadField> {
    private readonly ITokenizer _tokenizer;
    private readonly IEnumerable<IDataSet> _dataSets;
    public TypeaheadFieldElementDriver(IFormsBasedElementServices formsServices, ITokenizer tokenizer, IEnumerable<IDataSet> _dataSets)
        : base(formsServices)
    {
        _tokenizer = tokenizer;
        this._dataSets = _dataSets;
    }

    ...

    protected override void DescribeForm(DescribeContext context) {
        context.Form("TypeaheadField", factory =>
        {
            var shape = (dynamic)factory;
            var form = shape.Fieldset(
                Id: "TypeaheadField",
                _Value: shape.Textbox(
                    Id: "Value",
                    Name: "Value",
                    Title: "Value",
                    Classes: new[] { "text", "medium", "tokenized" },
                    Description: T("The value of this typeahead field.")),
               _DataSetIds: shape.SelectList(
                    Id: "DataSetIds",
                    Name: "DataSetIds",
                    Title: "Remote Datasets",
                    Multiple: true,
                    Description: T("The remote datasets to fetch suggestions from.")));

            foreach (var dataSet in _dataSets)
            {
                form._DataSetIds.Items.Add(new SelectListItem { Text = T(dataSet.Description).Text, Value = dataSet.Id });
            }

            return form;
        });

        ...
    }
}

这成功地为我的目的呈现了一个多选字段和某种作品,但我无法完全取消选择每个选项,因为被选中的选项不断被发布。出于这个原因和一般的易用性,我宁愿呈现一个复选框列表,但我不知道如何继续。

4

0 回答 0