在markMatch上选择2 toUpperCase错误

时间:2013-12-18 22:01:10

标签: json jquery jquery-select2

所以我一直在使用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部分,那么我想看到它或知道我做错了什么。

1 个答案:

答案 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 };
            }
        }
    });
});