根据标题,我在 HTML5 页面上使用最新的 select2 选择框,并使用他们的示例调用我创建的 Web API 2 端点。
出于测试目的,端点只需构建标签集合并将结果作为 HttpResponseMessage 返回。这是一些可视化的代码:
标签实体
public class TagData
{
public string Id { get; set; }
public string Text { get; set; }
}
该模型:
public class TagsModel
{
public IEnumerable<TagData> Tags { get; set; }
}
Web API 2 项目中的控制器操作:
public IHttpActionResult Get()
{
var tags = new TagsModel()
{
Tags = new List<TagData>
{
new TagData()
{
Id = "1",
Text = "Tag1"
},
new TagData()
{
Id = "2",
Text = "Tag2"
}
}
};
return Ok(tags);
}
我敲了一个单元测试,它也可以使用 composer 在 Fiddler4 中运行一个测试,返回以下 JSON 响应:
{"Tags":[{"Id":"1","Text":"Tag1"},{"Id":"2","Text":"Tag2"},{"Id":"3","Text":"Tag3"}}]}
在 HTML5 页面中,我放入了标准的 select2 html 元素:
<select class='s2-search-box form-control' multiple='multiple'></select>
这里的想法是将 select2 控件绑定到远程数据,然后使用标记功能允许用户找到一个标记,选择它并重复,所以这是使用这个 ajax 调用完成的:
$(document).ready(function () {
$(".s2-search-box").select2({
ajax: {
url: "http://localhost:54850/api/s2demo",
dataType: 'json',
delay: 250,
data: function (params) {
return {
q: params.term, // search term
page: params.page
};
},
processResults: function (data, page) {
// parse the results into the format expected by Select2.
// since we are using custom formatting functions we do not need to
// alter the remote JSON data
return {
results: data.Tags
};
},
cache: true
}
});
});
到目前为止一切顺利,我的单元测试工作正常,当我使用 Firebug 检查 ajax 调用时,我可以看到数据以正确的格式返回,并且我能够显示 data.Tags 集合,所以我知道数据在那里但是实际select2 下拉菜单显示“未定义”项目的列表,实际上并没有显示我想要的数据或允许我从这些选择中创建标签。
作为旁注,我也尝试了这个:
$(".s2-search-box").select2({
ajax: {
url: "http://localhost:54850/api/s2demo",
dataType: "json",
type: "GET",
data: function (params) {
var queryParameters = {
term: params.term
}
return queryParameters;
},
processResults: function (data) {
return {
results: $.map(data, function (item) {
return {
text: item.Text,
id: item.Id
}
}),
pagination: {
more: data.more
}
};
}
}
});
这样做的原因是我可以创建标签,以便它们在 select2 控件中显示为:
标签1[x] 标签2[x]
但是下拉列表会永久显示。
我正在使用最新的 4.0.2 版本的 select2 库。
提前致谢。
吨