在markMatch上Select2 toUpperCase错误

sks*_*laj 2 jquery json jquery-select2

因此,我一直在将select2用于非ajax查询,到目前为止,它一直非常有用。但是,我想对ajax json响应使用下拉菜单之一。在整篇文档中,几乎没有任何提示可以显示如何使用它。

整体文件:http//ivaynberg.github.io/select2/

除了要压缩的代码示例之外,几乎没有任何html代码或json示例,我现在正茫然无措。

所以这是我得到的一个json:

[{“ ST_CD”:“ NY”,“ ST_SHRT_NM”:“纽约”},{“ ST_CD”:“ NY”,“ ST_SHRT_NM”:“纽约1”}]

这是很标准的。我在文档中注意到,您需要映射一个“ id”和一个“文本”才能使它起作用。不知道为什么我不能照原样做,但是几乎没有任何文档。

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; }
        }
    });
});
Run Code Online (Sandbox Code Playgroud)

在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("");
    },
    (...)
}
Run Code Online (Sandbox Code Playgroud)

在此代码中,将填充结果对象,但未定义text属性。

我认为格式化我的json数据以符合前端html控件的标准或进行任何类型的json解析确实是不合理的。如果有一种方法select2可以允许我明确指定文本和id部分,那么我想看看它还是知道我在做什么错。

sks*_*laj 5

自从我问这个问题已经有一段时间了,但是我问了一个星期后就提出了一个解决方案。因此,我决定立即回答。.刚刚创建了一个DTO,它映射到EF使用linq创建的实际实体:

因此在服务器端:

public class StateDTO
{
    public string id { get; set; }
    public string text { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

然后在发送回之前被命中的查询

//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,
                             });
}
Run Code Online (Sandbox Code Playgroud)

我得到以下结果:[{“ id”:“ NY”,“ text”:“ New York”},{“ id”:“ NY”,“ text”:“ New York1”}]

由于我已经设置了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 };
            }
        }
    });
});
Run Code Online (Sandbox Code Playgroud)