如何在Razor模板中呈现相关实体

时间:2018-06-07 03:45:12

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

使用ASP.NET Core 2.0,Entity Framework Core和Visual Studio,我试图在剃刀视图中使用@foreach循环来呈现List" SecondEntityList"在Entity1模型中。我能够使用Entity Framework Core使用另一个视图和操作方法将数据保存到SQL Server本地DB。数据保存在dbo.Entity1和dbo.Entity2表中。

访问剃刀视图以列出相关实体列表会返回以下错误:

NullReferenceException: Object reference not set to an instance of an object.

如何使用@foreach循环来渲染" SecondEntityList"在Entity1中?

实体1

using System.Collections.Generic;

namespace Project.Models
{
    public class Entity1
    {
        public int Entity1Id { get; set; }
        public List<Entity2> SecondEntityList { get; set; }
    }
}

实体2

namespace Project.Models
{
    public class Entity2
    {
        public int Entity2Id { get; set; }
        public string Text { get; set; }

        public int Entity1Id { get; set; }
        public Entity1 Entity1 { get; set; }
    }
}

查看模型

using System.Collections.Generic;
namespace Project.Models.ViewModels
{
    public class MyViewModel
    {
        public Entity1 Entity1 = new Entity1();
        public IEnumerable<Project.Models.Entity2> Entity2List;
    }
}

行动方法

[HttpGet]
public IActionResult MyListView(long key, MyViewModel mvm)
{
    mvm.Entity1 = context.Entity1.Single(i => i.Entity1Id == key);
    mvm.Entity2List = mvm.Entity1.SecondEntityList;
    return View(mvm);
}

Razor查看

@model Sediment.Models.ViewModels.MyViewModel;
@foreach (Project.Models.Entity2 i in Model.Entity2List)
{
    @i.Text
}

1 个答案:

答案 0 :(得分:1)

出于多种原因,在视图中使用实体模型是不好的做法。但 是一种在查询中使用.Include(...)执行所要求的方法。

mvm.Entity1 =
    context.Entity1
        .Include(i => i.SecondEntityList)
        .Single(i => i.Entity1Id == key);

如果这是一个严肃的项目,并且您希望将此代码保留一段时间,我强烈建议您将您的视图问题与数据库分开。 否则,在放置db上下文后,您可能最终会尝试在剃刀视图中执行查询。在你可能遇到的许多其他错误中。