我在查询中使用(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代码-用于显示json的select2?
请帮忙
最佳答案
所以这个电话
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();