代码之家  ›  专栏  ›  技术社区  ›  Sfmar

在视图中显示ICollection

  •  1
  • Sfmar  · 技术社区  · 6 年前

    一对多关系 在作者和书之间,一个作者可以有多本书,而一本书只能属于一个作者:

    模型:

    public class Author 
    {
       public int AuthorId { get; set; }
       public string Name { get; set; }
    
       public ICollection<Book> Books { get; set; }
    }
    
    public class Book 
    {
       public int BookId { get; set; }
       public string Name { get; set; }
    
       public int? AuthorId { get; set; }
       public Author Author { get; set; }
    }
    

    我已经使用EF生成了带有视图的适当控制器,现在,我想在Details.cshtml视图中为每个作者显示相应的相关书籍的名称。

    这个

    // GET: Authors/Details/5
    public async Task<ActionResult> Details(int? id)
    {
        if (id == null)
        {
           return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
        }
    
        Author author = await db.Authors.FindAsync(id);
    
        if (author == null)
        {
           return HttpNotFound();
        }
           return View(author);
    }
    

    详细信息.cshtml 具体如下:

    @model MyApp.Models.Author
    
    <div>
        <h4>Author Info</h4>
        <hr />
        <dl class="dl-horizontal">
            <dt style="font-size:20px">
                @Html.DisplayNameFor(model => model.Name)
            </dt>
    
            <dd style="font-size:20px">
                @Html.DisplayFor(model => model.Name)
            </dd>
    
            <dt style="font-size:20px">
                Associated Books
            </dt>
            @foreach (var item in Model.Books)
            {
                <dd>
                    @item.Name
                </dd>
            }
    
        </dl>
    </div>
    

    但这会产生以下错误:

    详细信息:System.NullReferenceException:对象引用未设置为 对象的实例。

    我已经找到了这个类似问题的答案( How to display a collection in View of ASP.NET MVC Razor project? )但是,显然,没有成功。有人能告诉我我做错了什么吗?

    1 回复  |  直到 6 年前
        1
  •  3
  •   Marcell Toth    6 年前

    你的视野很好。

    问题是 Books 你的财产 Author 将保持为空。

    您还必须通过使用手动告诉上下文来加载书籍 .Include . 例如:

    Author author = await db.Authors.Include(a => a.Books).SingleOrDefault(a => a.AuthorId == id);