我正在使用Entity Framework
来访问数据库中的数据
当我调试代码时,List<Book> books
包含元素
但是,我无法在HTML页面中显示它
如果我宣布新的List<Book>
,我可以检索这个
这不起作用:
public IEnumerable<Book> GetBooks()
{
List<Book> books = db.Books.ToList();
return books;
}
然而,这是有效的:
public IEnumerable<Book> GetBooks()
{
List<Book> books = new List<Book>
{
new Book {BookId =1, Title="hehe",AuthorId=1,Genre="Trinh Tham" },
new Book {BookId =2, Title="Kaka",AuthorId=2, Genre="Sport"}
};
return books;
}<br />
这是我的html页面:
<ul id="books"></ul>
<script src="Scripts/jquery-2.1.4.min.js"></script>
<script type="text/javascript">
$(document).ready(function () {
$.getJSON('api/Books/GetBooks').done(function (data) {
$.each(data, function (index, item) {
$("#books").append("<li>" + item.Title + " - " + item.Genre + "</li>");
});
});
});
</script>
答案 0 :(得分:0)
为什么不在c#/ asp.net框架中构建列表?这不会太难......请参阅similar post
在html中构建ul元素,然后从代码隐藏
添加li答案 1 :(得分:0)
我之前遇到过这种情况。在调试api控制器时,很可能是一个JSON序列化错误。要查看实际的错误消息,只需将URL复制并粘贴到浏览器中,它就会显示错误消息。因此,如果您在visual studio中进行调试,请转到http://localhost:[portnumber]/api/Books/GetBooks
如果我不得不猜测,我会说你有一些协会(外键),例如作者引起了这个问题。通常发生的是您的实体框架连接在您的列表被序列化之前被丢弃,这会引发错误。所以你有几个选择:
您可以创建一个自定义类,例如BookJson,并且只需要在其中序列化所需的内容,以便在api控制器序列化之前返回对象包含其中的所有数据。另外,您只能获取序列化而不是整个对象所需的信息。它看起来像这样:
public class BookJson
{
public int BookId {get; set;}
public string Title {get; set;}
public string AuthorName {get; set;}
public string Genre {get; set;}
}
public IEnumerable<BookJson> GetBooks()
{
return db.Books.Select(x => new BookJson { BookId = x.BookId, Title = x.Title, AuthorName = x.Author.Name, Genre = x.Genre}).ToList();
}
另一种选择是在你的数据库调用中使用.Include,它将使Entity Framework继续运行并在它被处理之前获取相关数据。序列化。您只需确保包含所有相关实体。所以像这样:
db.Books.Include("Author").ToList();
最后一个选项与前一个选项类似,只是您只是在实体框架上下文中禁用延迟加载,以便检索所有相关的实体数据。要执行此操作,您只需在数据上下文中设置此选项:
db.Configuration.LazyLoadingEnabled = false;
db.Books.ToList();