在视图中显示ICollection

时间:2018-11-07 17:24:28

标签: c# asp.net asp.net-mvc entity-framework entity-framework-6

我正在使用ASP.NET MVC5开发一个项目,并使用EF6。 我有以下课程,在作者和图书之间具有一对多关系,其中作者可以拥有多本书,而一本书只能属于一个作者:

型号:

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);
}

我的 Details.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 个答案:

答案 0 :(得分:2)

您的视图非常好。

问题是 EF默认不会加载相关实体(出于性能原因),因此NSLayoutConstraint.activate上的Books属性将保持为空。

您还必须使用Author手动告诉上下文加载书籍。例如:

.Include