所以我一直在使用select2进行非ajax查询,到目前为止它非常有用。但是,我想使用其中一个下拉列表来获取ajax json响应。在整个单片文档中,几乎没有发现如何使用它的tid位。
单片文档:http://ivaynberg.github.io/select2/
除了正在编写的代码示例,几乎没有任何HTML代码或json示例之外,我现在正在亏损。
所以这是我得到的一个json:
[{“ST_CD”:“NY”,“ST_SHRT_NM”:“纽约”},{“ST_CD”:“NY”,“ST_SHRT_NM”:“New York1”}]
这是非常标准的。我在文档中注意到你需要映射一个“id”和一个“text”来实现这一点。不知道为什么我不能这样做,但几乎没有任何文件。
https://groups.google.com/forum/#!topic/select2/rDPFU0IWpE0
select2的作者提到了这些关键事实:
你需要在选项中提供id函数,因为你的id键 是“Id”而不是“id”。
您还需要提供formatResult和formatSelection选项 因为你没有“文本”键。
此处遇到同样问题的用户:https://github.com/ivaynberg/select2/issues/693 也表明这是准确的。
然而,这不适用于我。
$(document).ready(function () {
$("#e6").select2({
id: function(e) { return e.ST_CD },
placeholder: "Search for a movie",
minimumInputLength: 1,
ajax: {
url: "api/VendorLocation",
dataType: 'json',
data: function (term, page) {
return {};
},
results: function (data, page) {
return { results: data };
},
formatResult: function (item) { return item.ST_SHRT_NM; },
formatSelection: function (item) { return item.ST_SHRT_NM; }
}
});
});
在返回ajax函数的结果部分时,数据对象被正确填充。它有我需要的数据(ST_CD和ST_SHRT_NM具有正确的值),当我继续时,那就是我得到错误。无论formatResult和formatSelection在哪里,都会显示相同的错误。
所以我调试到Select2,这就是出现错误的地方:
$.fn.select2.defaults = {
(...)
formatResult: function (result, container, query, escapeMarkup) {
var markup = [];
markMatch(result.text, query.term, markup, escapeMarkup);
return markup.join("");
},
(...)
}
在此代码中,结果对象已填充,但text属性未定义。
我认为将json数据格式化为符合前端html控件的标准或进行任何类型的json解析是非常不合理的。如果有一种方法,select2可以允许我明确指定文本和id部分,那么我想看到它或知道我做错了什么。
答案 0 :(得分:4)
自从我提出这个问题以来已经有一段时间了,但在我问这个问题后一周我想出了一个解决方案。所以我现在决定回答它..刚刚创建了一个DTO,它映射到EF使用linq创建的实际实体:
所以在服务器端:
public class StateDTO
{
public string id { get; set; }
public string text { get; set; }
}
然后在发回之前被点击的查询
//the context is generated from EF
public IQueryable<StateDTO> Get(string st_name)
{
return (
from state in this.context.States
where state.ST_SHRT_NM.Contains(st_name)
select new StateDTO() { id = state.ST_CD,
text = state.ST_SHRT_NM,
});
}
我得到以下结果: [{&#34; id&#34;:&#34; NY&#34;,&#34; text&#34;:&#34; New York&#34;},{&#34; id&#34;: &#34; NY&#34;,&#34; text&#34;:&#34; New York1&#34;}]
因为我已经设置了select2配置,所以它在那之后工作:
$(document).ready(function () {
$("#e6").select2({
placeholder: "Search for a movie",
minimumInputLength: 1,
ajax: {
url: "api/States",
dataType: 'json',
data: function (term, page) {
return {};
},
results: function (data, page) {
return { results: data };
}
}
});
});