读取.net核心视图中的所有行

时间:2018-04-29 08:53:26

标签: c# entity-framework asp.net-core ef-core-2.0

我目前正在通过创建一个虚构的书店来试验.NET核心。

在数据库中我有3个表: 1.书籍 - 所有书籍 2.作者 - 所有作者 3. BookAuthors - 中介(多对多关系)b / n书籍和作者

我希望能够阅读所有当前的作者,并在她想要添加新书时向用户显示(如果存在给定作者,则可以选择它)。

我在BookController中尝试过类似的东西:

        public async Task<ActionResult> Add()
    {
        var book = await _appDbContext.Books
        .Include(b => b.BookAuthors)
            .ThenInclude(a => a.Author)
        .AsNoTracking()
        .ToListAsync()

        return View(book);
    }

但是,如果我尝试,我会抛出此异常: enter image description here

如果我尝试这样的话:

        public async Task<ActionResult> Add()
    {
        var book = await _appDbContext.Books
        .Include(b => b.BookAuthors)
            .ThenInclude(a => a.Author)
        .AsNoTracking()
        .SingleOrDefaultAsync(m => m.BookId == 2);

        return View(book);
    }

它有效,但它只返回一位作者(当然:))

enter image description here

如果有人能帮我一点,我会非常感激。 谢谢!

2 个答案:

答案 0 :(得分:1)

在你的Razor视图中,你期待一本的书。

但是从控制器中你传递的是列表的书籍。

这就是异常告诉你的。

如果您要在Razor视图中处理图书清单,则需要将模型更改为List<MyBookstore.Models.Book>并迭代结果

答案 1 :(得分:0)

对于解决方案,我使用ViewComponent列出了数据库中的所有作者。

  1. 在我的项目中创建名为 ViewComponents
  2. 的新文件夹
  3. 在其中我创建了一个 AuthorsListViewComponent.cs

    public class AuthorsListViewComponent : ViewComponent
    {
      private readonly ApplicationDbContext _appDbContext;
    
    public AuthorsListViewComponent(ApplicationDbContext appDbContext)
    {
        _appDbContext = appDbContext;
    }
    
    public async Task<IViewComponentResult> InvokeAsync()
    {
        var authorsList = await GetItemsAsync();
        return View(authorsList);
    }
    
    private Task<List<Author>> GetItemsAsync()
    {
        return _appDbContext.Authors.ToListAsync();
    }
    

    }

  4. Views / Shared / Components / AuthorsList 里面我创建了视图 @model IEnumerable

  5. @model IEnumerable<Author>
    
    <h2>Authors List</h2>
    <div class="form-group">
        <label for="sel1">Select Author(hold ctrl / shift for multiple selection):</label>
        <select class="form-control" id="sel1" multiple>
            @foreach (var author in Model)
            {
                <option>@author.Name</option>
            }
        </select>
    </div>

    1. 然后我只是在 Add.cshtml
    2. 中使用ViewComponent

              @await Component.InvokeAsync("AuthorsList")
              <div class="form-group">
                  <label asp-for="Description"></label>
                  <textarea asp-for="Description" class="form-control" rows="10"></textarea>
                  <span asp-validation-for="Description" class="text-danger"></span>
              </div>