无法在数据库中显示数据

时间:2015-08-23 07:00:11

标签: asp.net api

我正在使用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>

2 个答案:

答案 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();