我正在尝试构建一个自定义的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;
});
...
}
}
这成功地为我的目的呈现了一个多选字段和某种作品,但我无法完全取消选择每个选项,因为被选中的选项不断被发布。出于这个原因和一般的易用性,我宁愿呈现一个复选框列表,但我不知道如何继续。