C#-MVC-如何基于一个外键列出多个条目

C#-MVC-如何基于一个外键列出多个条目,c#,database,list,foreign-keys,C#,Database,List,Foreign Keys,这是我的第一篇帖子,所以我为自己的无知道歉 我试图根据所选类别ID选择链接到类别的大量项目。我知道我需要以某种方式利用模型中创建的列表,但我不确定如何使用 换句话说,我想在Category“Details”视图中列出菜单项,基于在站点上选择的类别 菜单分类模型 public class MenuCategory { public int MenuCategoryId { get; set; } public string Name

这是我的第一篇帖子,所以我为自己的无知道歉

我试图根据所选类别ID选择链接到类别的大量项目。我知道我需要以某种方式利用模型中创建的列表,但我不确定如何使用

换句话说,我想在Category“Details”视图中列出菜单项,基于在站点上选择的类别

菜单分类模型

public class MenuCategory
{
    public int MenuCategoryId
    {
        get;
        set;
    }
    public string Name
    {
        get;
        set;
    }     
    public List<MenuItem> MenuItems
    {
        get;
        set;
    }
}
public class MenuItem
{
    public int MenuItemId
    {
        get;
        set;
    }
    public string Name
    {
        get;
        set;
    }
    public string Image
    {
        get;
        set;
    }

    [ForeignKey("MenuCategory")]
    public int MenuCategoryId
    {
        get;
        set;
    }
    public MenuCategory MenuCategory
    {
        get;
        set;
    }        
}
菜单分类视图索引

        <thead>
        <tr>
            <th>
                @Html.DisplayNameFor(model => model.Name)
            </th>
            <th></th>
        </tr>
    </thead>
    <tbody>
@foreach (var item in Model) {
        <tr>
            <td>
                @Html.DisplayFor(modelItem => item.Name)
            </td>
            <td>

                <a asp-controller="MenuCategories" asp-action="Details" asp-route-id="@item.MenuCategoryId">
                Details
                </a> 

            </td>
        </tr>
}
    </tbody>

@DisplayNameFor(model=>model.Name)
@foreach(模型中的var项目){
@DisplayFor(modelItem=>item.Name)
细节
}
菜单分类详细信息视图

  @model Farbucks.Models.MenuCategory

@{
    ViewData["Title"] = "Details";
}

<h2>Details</h2>

<div>
    <h4>MenuCategory</h4>
    <hr />
    <dl class="dl-horizontal">
        <dt>
            @Html.DisplayNameFor(model => model.Name)
        </dt>

    </dl>
</div>

@foreach (var item in Model.MenuItems)
{
    @Html.DisplayFor(modelItem => item.Name)
}
foreach(var item in Model.MenuItems)
{
 // display information of Menu item here.
}
@model Farbucks.Models.MenuCategory
@{
ViewData[“标题”]=“详细信息”;
}
细节
菜单分类

@DisplayNameFor(model=>model.Name) @foreach(Model.MenuItems中的var项) { @DisplayFor(modelItem=>item.Name) }
菜单类别控制器

{
    public class MenuCategoriesController : Controller
    {
        private readonly ApplicationDbContext _context;

        public MenuCategoriesController(ApplicationDbContext context)
        {
            _context = context;
        }

        // GET: MenuCategories
        public async Task<IActionResult> Index()
        {
            return View(await _context.MenuCategory.ToListAsync());
        }

        // GET: MenuCategories/Details/5
        public async Task<IActionResult> Details(int? id)
        {
            if (id == null)
            {
                return NotFound();
            }

            var menuCategory = await _context.MenuCategory
                .FirstOrDefaultAsync(m => m.MenuCategoryId == id);
            if (menuCategory == null)
            {
                return NotFound();
            }

            return View(menuCategory);
        }


    }
}
{
    public class MenuItemsController : Controller
    {
        private readonly ApplicationDbContext _context;

        public MenuItemsController(ApplicationDbContext context)
        {
            _context = context;
        }

        // GET: MenuItems
        public async Task<IActionResult> Index()
        {
            var applicationDbContext = _context.MenuItem.Include(m => m.MenuCategory);
            return View(await applicationDbContext.ToListAsync());
        }

        // GET: MenuItems/Details/5
        public async Task<IActionResult> Details(int? id)
        {
            if (id == null)
            {
                return NotFound();
            }

            var menuItem = await _context.MenuItem
                .Include(m => m.MenuCategory)
                .FirstOrDefaultAsync(m => m.MenuItemId == id);
            if (menuItem == null)
            {
                return NotFound();
            }

            return View(menuItem);
        }


    }
}
{
公共类菜单分类控制器:控制器
{
私有只读应用程序的bContext\u上下文;
公共菜单类别控制器(ApplicationDbContext上下文)
{
_上下文=上下文;
}
//获取:菜单分类
公共异步任务索引()
{
返回视图(wait_context.menucategray.ToListAsync());
}
//获取:菜单类别/详细信息/5
公共异步任务详细信息(int?id)
{
if(id==null)
{
返回NotFound();
}

var menuCategory=wait_context.menuCategory .FirstOrDefaultAsync(m=>m.MenuCategoryId==id); 如果(menuCategory==null) { 返回NotFound(); } 返回视图(菜单分类); } } }
MenuItems控制器

{
    public class MenuCategoriesController : Controller
    {
        private readonly ApplicationDbContext _context;

        public MenuCategoriesController(ApplicationDbContext context)
        {
            _context = context;
        }

        // GET: MenuCategories
        public async Task<IActionResult> Index()
        {
            return View(await _context.MenuCategory.ToListAsync());
        }

        // GET: MenuCategories/Details/5
        public async Task<IActionResult> Details(int? id)
        {
            if (id == null)
            {
                return NotFound();
            }

            var menuCategory = await _context.MenuCategory
                .FirstOrDefaultAsync(m => m.MenuCategoryId == id);
            if (menuCategory == null)
            {
                return NotFound();
            }

            return View(menuCategory);
        }


    }
}
{
    public class MenuItemsController : Controller
    {
        private readonly ApplicationDbContext _context;

        public MenuItemsController(ApplicationDbContext context)
        {
            _context = context;
        }

        // GET: MenuItems
        public async Task<IActionResult> Index()
        {
            var applicationDbContext = _context.MenuItem.Include(m => m.MenuCategory);
            return View(await applicationDbContext.ToListAsync());
        }

        // GET: MenuItems/Details/5
        public async Task<IActionResult> Details(int? id)
        {
            if (id == null)
            {
                return NotFound();
            }

            var menuItem = await _context.MenuItem
                .Include(m => m.MenuCategory)
                .FirstOrDefaultAsync(m => m.MenuItemId == id);
            if (menuItem == null)
            {
                return NotFound();
            }

            return View(menuItem);
        }


    }
}
{
公共类MenuItemsController:控制器
{
私有只读应用程序的bContext\u上下文;
公共菜单项控件(ApplicationDbContext上下文)
{
_上下文=上下文;
}
//获取:菜单项
公共异步任务索引()
{
var applicationDbContext=_context.MenuItem.Include(m=>m.MenuCategory);
返回视图(等待applicationDbContext.toListSync());
}
//获取:MenuItems/Details/5
公共异步任务详细信息(int?id)
{
if(id==null)
{
返回NotFound();
}
var menuItem=wait_context.menuItem
.包括(m=>m.MenuCategory)
.FirstOrDefaultAsync(m=>m.MenuItemId==id);
if(menuItem==null)
{
返回NotFound();
}
返回视图(菜单项);
}
}
}

菜单类别详细信息视图中,您可以使用

看起来像是下面被剪掉的:

菜单分类详细信息视图

  @model Farbucks.Models.MenuCategory

@{
    ViewData["Title"] = "Details";
}

<h2>Details</h2>

<div>
    <h4>MenuCategory</h4>
    <hr />
    <dl class="dl-horizontal">
        <dt>
            @Html.DisplayNameFor(model => model.Name)
        </dt>

    </dl>
</div>

@foreach (var item in Model.MenuItems)
{
    @Html.DisplayFor(modelItem => item.Name)
}
foreach(var item in Model.MenuItems)
{
 // display information of Menu item here.
}

不幸的是,我现在得到一个错误,对象引用没有设置为对象的实例。我很感激你给我的东西。你编写了行动细节,我的意思是你可以在这里得到菜单项的价值。所以请告诉我你的代码。我刚刚更新了。我只是有点迷路了,抱歉。不,controller.var menuCategory=wait_context.menuCategory.Where中的操作(m=>m.MenuCategoryId==id)。选择(p=>new menuCategory{MenuItems=\u context.MenuItem.Where(p=>p.MenuCategoryId==id)。ToList(),//其余的道具})。FirstOrDefaultAsync();