我在查询中使用(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();

10-05 20:43
查看更多