我目前正在通过创建一个虚构的书店来试验.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);
}
如果我尝试这样的话:
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);
}
它有效,但它只返回一位作者(当然:))
如果有人能帮我一点,我会非常感激。 谢谢!
答案 0 :(得分:1)
在你的Razor视图中,你期待一本单的书。
但是从控制器中你传递的是列表的书籍。
这就是异常告诉你的。
如果您要在Razor视图中处理图书清单,则需要将模型更改为List<MyBookstore.Models.Book>
并迭代结果
答案 1 :(得分:0)
对于解决方案,我使用ViewComponent列出了数据库中的所有作者。
在其中我创建了一个 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();
}
}
在 Views / Shared / Components / AuthorsList 里面我创建了视图 @model IEnumerable
@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>
@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>