我在我的查询中使用(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?
请帮忙
答案 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};
}