如何将远程数据加载到select2并按标题搜索

时间:2017-08-30 18:20:39

标签: javascript json asp.net-mvc jquery-select2

我在我的查询中使用(FOR JSON PATH,WITHOUT_ARRAY_WRAPPER)返回了一些数据。我在我的服务器端(mvc控制器)调用此查询来获取json数据,因此我稍后可以在我的视图中将其加载到select2中。

我在电影控制器中使用此代码

public async Task<ActionResult> DisplayMovies()
    {
        Movies [] movieList = await movieStorage.GetAllMovies();

        if(Request.IsAjaxRequest())
        {
            return Json(movieList, JsonRequestBehavior.AllowGet);
        }
        else
        {
            return View();
        }
    }

当我调试这段代码时,调试器会像这样返回json:

[{"Title": "Shawshank Redemption", "Director": "Frank Darabont", "Genre": "Drama", "ReleaseYear": "1994", "Rating": "9,3"},
{"Title": "Shutter Island", "Director": "Martin Scorsese", "Genre": "Mystery", "ReleaseYear": "2010", "Rating": "8,1"},
{"Title": "Pulp Fiction", "Director": "Quentin Tarantino", "Genre": "Crime", "ReleaseYear": "1994", "Rating": "8,9"}]

这是我的.js

var myUrl = '@Url.Action("DisplayMovies", "Movies")';
$('.myMovies').select2(   {
    placeholder: 'Select movie...' ,
    minimumInputLength: 1,
    ajax: { 
        url: myUrl,
        dataType: 'json',
        data: function (term, page) {
            return {
                searchTerm: term
            };
        },
        results: function (data, page) {                                                     
            return {results: data};
        }
    }
});

html

<select class="myMovies" multiple="multiple">
</select>

然而,当我运行它时,chrome或firefox中的控制台中没有结果也没有错误。

如果我将我的电影控制器更改为静态的,它会突然起作用:

public async Task<ActionResult> DisplayMovies()
    {
        var list = new[]
        {
            new { id = 0, title = "Shawshank Redemption" },
            new { id = 1, title = "Shutter Island" },
            new { id = 2, title = "Pulp Fiction" },
        }.ToList();

        if (Request.IsAjaxRequest())
        {
            Object json = JsonConvert.SerializeObject(list);
            return Json(json, JsonRequestBehavior.AllowGet);
        }
        else
        {
            return View();
        }
    }

为什么这会起作用,但是当我从数据库中获取数据时却不行?错误在哪里?我从数据库得到的json是不正确的,还是javascript代码 - select2用于显示json?

请帮忙

2 个答案:

答案 0 :(得分:1)

所以这个电话

Movies [] movieList = await movieStorage.GetAllMovies();

返回此json

[{"Title": "Shawshank Redemption", "Director": "Frank Darabont", "Genre": "Drama", "ReleaseYear": "1994", "Rating": "9,3"},
{"Title": "Shutter Island", "Director": "Martin Scorsese", "Genre": "Mystery", "ReleaseYear": "2010", "Rating": "8,1"},
{"Title": "Pulp Fiction", "Director": "Quentin Tarantino", "Genre": "Crime", "ReleaseYear": "1994", "Rating": "8,9"}]

它与

的json不匹配
[
{"id": 0, "title":"Shawshank Redemption"}
...
]

因此,请设置查询响应以匹配有效的结构。

Movies [] movieList = await movieStorage.GetAllMovies()
    .Select((v,i) => new { id = i, title = v.Title }).ToArray();

答案 1 :(得分:1)

来自docs

  

我的对象不使用ID作为唯一标识符,我该怎么办?

     

Select2要求id属性用于唯一标识结果列表中显示的选项。如果您使用id以外的属性(如pk)来唯一标识选项,则需要将旧属性映射到id,然后再将其传递给Select2。

     

我的对象使用文本以外的属性来显示需要显示的文字

     

与id属性一样,Select2要求为选项显示的文本存储在text属性中。您可以使用以下JavaScript从任何现有属性映射此属性。

您需要从数据库返回某种id的记录,以便与select2一起使用。然后您将结果映射如下:

results: function (data, page) {
    var data = $.map(data, function (obj) {
        obj.id = obj.someID;//some id you don't have right now
        obj.text = obj.Title;
        return obj;
    });
        return {results: data};
}