我有一个从模型中检索数据的控制器,并希望添加在div中检索的每一位数据,其中数据是div中的一个段落,但是我无法使其工作。 / p>
这是我的控制者:
namespace MyGamesProject.Controllers
{
public class GamesController : ApiController
{
private GamesDBEntities db = new GamesDBEntities();
// GET: api/Games
public IQueryable<object> GetAllGames()
{
var games = db.Games.Include(d => d.DailyDatas)
.GroupBy(d => new { d.name, d.year })
.OrderBy(d => d.Key.name)
.Select(d => new
{
d.Key.year,
d.Key.name
}
);
return games;
}
}
}
这是我在cshtml视图页面中使用的ajax:
<div id="test"></div>
@section Scripts {
<script>
$.ajax({
url: "/api/Games/",
method: "GET",
dataType: 'json',
success: success
});
function success(data)
{
$.each(data, function (i, val)
{
var $data = $('<p>' + val.name + ' ' + ' was released in ' + val.year + '</p>')
$data.appendTo($('#test'));
});
}
</script>
}
当加载页面时,页面是空白的并且在div中添加检索到的数据作为段落似乎没有用,我不确定它为什么不起作用。我是否错误地构建了测试div中的段落,或者将它们插入错误的位置?任何帮助都会很棒。
答案 0 :(得分:1)
变量games
仍然是LINQ查询。您需要在其上调用ToList()
或ToArray()
,以便执行查询并为您提供结果项。
public IEnumerable<object> GetAllGames()
{
var games = db.Games.Include(d => d.DailyDatas)
.GroupBy(d => new { d.name, d.year })
.OrderBy(d => d.Key.name)
.Select(d => new
{
d.Key.year,
d.Key.name
}
);
return games.ToList();
}
这里,由于我们调用ToList
方法,该方法的返回值是匿名对象列表(具有年份和名称属性)。所以我们必须将方法的返回类型更改为IEnumerable<object>
您可以打开浏览器devtools(F12) - &gt;网络标签,查看正在进行的ajax通话及其响应。如果关于url和路由的一切都很好,你应该在响应体中看到带有json数组的200 OK响应。如果您看到404,则表示您的客户端代码尝试访问的网址未正确设置路由。如果您看到500,则表示您的服务器代码已被调用,但由于在执行代码期间发生了一些异常而导致崩溃。您可能会在响应选项卡中看到异常详细信息。
此外,您当前的代码正在循环内执行jquery选择器$('#test')
。您可以通过在循环外缓存容器元素选择器来改进它。
function success(data) {
var $container = $('#test');
var items = '';
$.each(data, function (i, val) {
items += '<p>' + val.name + ' ' + ' was released in ' + val.year + '</p>';
});
$container.append(items);
}
答案 1 :(得分:0)
当您致电/api/Games/
网址时,默认情况下API调用Get
方法在您的API中。如果要覆盖它,则需要URL路由。如果继续GetAllGames()
,则使用属性路由或在WebApiConfig.cs
文件中写入路由。 (另请参阅下面的 @Shyju 评论)
此外,变量games
是一个LINQ查询,您需要调用ToList()
来执行数据。
控制器:
namespace MyGamesProject.Controllers
{
public class GamesController : ApiController
{
public IHttpActionResult Get(long id)
{
var games = db.Games.Include(d => d.DailyDatas)
.GroupBy(d => new { d.name, d.year })
.OrderBy(d => d.Key.name)
.Select(d => new
{
d.Key.year,
d.Key.name
}).ToList();
return Ok(games);
}
}
}
查看页面:
<div id="test"></div>
@section Scripts {
<script>
$(function () {
$.ajax({
url: "/api/Games/",
method: "GET",
dataType: 'json',
success: success
});
function success(data)
{
$.each(data, function (i, val)
{
var $data = $('<p>' + val.name + ' ' + ' was released in ' + val.year + '</p>')
$data.appendTo($('#test'));
});
}
});
</script>
}
答案 2 :(得分:0)
IQueryable只是一个查询。它不会产生结果。附加 tolist()。在这种情况下,它没有给你结果bcoz没有 数据库上下文触发IQueryable。数据库上下文被处理掉了 时刻控制去了。
校正
namespace MyGamesProject.Controllers
{
public class GamesController : ApiController
{
private GamesDBEntities db = new GamesDBEntities();
// GET: api/Games
public IHttpActionResult GetAllGames()
{
var games = db.Games.Include(d => d.DailyDatas)
.GroupBy(d => new { d.name, d.year })
.OrderBy(d => d.Key.name)
.Select(d => new
{
d.Key.year,
d.Key.name
}
).ToList();
return Ok(games);
}
}
}