C# 当使用fluent api包含相关数据时,列表不会在ajax中填充(使用Web api)
在我的ASP.NET Web表单应用程序(使用code first EF和Web Api)中,我需要使用ajax读取项目列表(C# 当使用fluent api包含相关数据时,列表不会在ajax中填充(使用Web api),c#,asp.net,ajax,entity-framework,asp.net-web-api,C#,Asp.net,Ajax,Entity Framework,Asp.net Web Api,在我的ASP.NET Web表单应用程序(使用code first EF和Web Api)中,我需要使用ajax读取项目列表(list),并用以下代码填充帖子列表。然而,我有一个奇怪的问题,如下所述 function LoadPostsByTimeframe(currTimeframeId) { jQuery.support.cors = true; $.ajax({ url: '/api/post/GetPostsByTimeframe
list
),并用以下代码填充帖子列表。然而,我有一个奇怪的问题,如下所述
function LoadPostsByTimeframe(currTimeframeId) {
jQuery.support.cors = true;
$.ajax({
url: '/api/post/GetPostsByTimeframe?tfId=' + currTimeframeId,
type: 'GET',
contentType: "application/json; charset=utf-8;",
dataType: 'json',
success: function (response) {
var posts = response.d;
//do stuff
},
error: function (x, y, z) {
alert(x + '\n' + y + '\n' + z);
}
});
}
在控制器类中,当我使用以下方法检索项目列表时:
[ScriptMethod(ResponseFormat = ResponseFormat.Json)]
public IList<Post> GetPostsByTimeframe(int tfId)
{
gEchoLuDBContext db = new gEchoLuDBContext();
var posts = db.Posts.Where(p=>p.TimeFrameId == tfId).ToList();
return posts;
}
我有这个输出(只返回第一项,其余两项为空):在这两种情况下(包括或不包括),控制器方法返回一个包含所有项的有效
列表。但是,对于Include版本,列表值(第一个值除外)不会显示在ajax/jquery端
你认为我遗漏了什么吗?试着在.ToList()
之前添加.AsNoTracking()
试着添加。AsNoTracking()
就在之前。ToList()
试着在之前添加。AsNoTracking()
就在之前添加。ToList()试着添加.AsNoTracking()
就在.ToList()之前
是的,它成功了!你能解释一下吗?我找到了这个解释,但它不太理解:返回一个新查询,其中返回的实体不会缓存在DbContext或ObjectContext中。使用AsNoTracking的一部分是,这些实体成为原始POCO对象,而不是可以作为引用的代理POCO对象(使用指针指向内存中已存在的对象,而不是该对象的多个副本)。但是,我不明白为什么它会在我的场景中造成麻烦?简单的回答是,你不应该像以前那样序列化代理POCO类,因为有时你可能无法得到你所期望的。也许你打开了延迟加载?是的,它起了作用!你能解释一下吗?我找到了这个解释,但它不太明白:返回一个返回的实体将不会缓存在DbContext或ObjectContext中的新查询。使用AsNotTrack的一部分是,实体将成为原始POCO对象,而不是可以作为引用的代理POCO对象(使用指针指向内存中已存在的对象,而不是该对象的多个副本)。但是,我不明白为什么它会在我的场景中造成麻烦?简单的回答是,你不应该像以前那样序列化代理POCO类,因为有时你可能无法得到你所期望的。也许你打开了延迟加载?是的,它起了作用!你能解释一下吗?我找到了这个解释,但它不太明白:返回一个返回的实体将不会缓存在DbContext或ObjectContext中的新查询。使用AsNotTrack的一部分是,实体将成为原始POCO对象,而不是可以作为引用的代理POCO对象(使用指针指向内存中已存在的对象,而不是该对象的多个副本)。但是,我不明白为什么它会在我的场景中造成麻烦?简单的回答是,你不应该像以前那样序列化代理POCO类,因为有时你可能无法得到你所期望的。也许你打开了延迟加载?是的,它起了作用!你能解释一下吗?我找到了这个解释,但它不太明白:返回一个返回的实体将不会缓存在DbContext或ObjectContext中的新查询。使用AsNotTrack的一部分是,实体将成为原始POCO对象,而不是可以作为引用的代理POCO对象(使用指针指向内存中已存在的对象,而不是该对象的多个副本)。但是,我不明白为什么它会在我的场景中造成麻烦?简单的答案是,您不应该像以前那样序列化代理POCO类,因为有时您可能无法获得预期的结果。也许您启用了延迟加载?
[ScriptMethod(ResponseFormat = ResponseFormat.Json)]
public IList<Post> GetPostsByTimeframe(int tfId)
{
gEchoLuDBContext db = new gEchoLuDBContext();
var posts = db.Posts.Include(po=>po.Person).Where(p=>p.TimeFrameId == tfId).ToList();
return posts;
}