在 ASP.NET 核心 MVC 中的单个视图中显示多个表

Display Multiple Tables In A Single View In ASP.NET Core MVC

我正在使用 ASP.NET Core MVC(最新版本)构建网站。我有动物 table 和类别 table,看起来像这样:

在我的 AdminController 上,我有一个 Index 操作,它最终应该显示一个 table,它显示动物的数据 table(名称、年龄、图片、描述)及其类别。这意味着我需要来自 Animals 和 Categories tables.

的数据

问题是我不明白这个组合怎么做。我已经尝试使用 ViewModel,但我现在仍然不知道如何处理动物的数据及其每个动物的类别?

现在一切正常,除了类别名称部分 - 它保持为空。 我认为我的问题出在 foreach 部分,但我不知道如何解决它。

这是我的代码- 管理员控制器:

public class AdminController : Controller
{
    readonly IAnimalService _animalService;
    readonly ICategoryService _categoryService;
    public AdminController(IAnimalService animalService, ICategoryService categoryService)
    {
        _animalService = animalService;
        _categoryService = categoryService;
    }
    public async Task<IActionResult> Index()
    {

        var model = new AdminViewModel()
        {
            Animals = await _animalService.GetAllAsync(),
            Categories = await _categoryService.GetAnimalCategory()

        };
        return View(model);
    }

管理员视图模型:

namespace PetShop.Client.Models
{
    public class AdminViewModel
    {
        public IQueryable<Animal> Animals { get; set; }
        public IQueryable<Category> Categories { get; set; }
    }
}

索引视图:

@model PetShop.Client.Models.AdminViewModel

@{
    ViewBag.Title = "Index";
}

<h1>Index</h1>

<p>
    <a asp-action="Create">Create New</a>
</p>
<table class="table">
    <thead>
        <tr>
            <th>
                @Html.DisplayNameFor(m=> Model.Animals.FirstOrDefault().Name);
            </th>
            <th>
                @Html.DisplayNameFor(m=> Model.Animals.FirstOrDefault().BirthDate);
            </th>
            <th>
                @Html.DisplayNameFor(m=> Model.Animals.FirstOrDefault().Description);
            </th>
            <th>
                @Html.DisplayNameFor(m=> Model.Animals.FirstOrDefault().PhotoUrl);
            </th>
            <th>
                @Html.DisplayNameFor(m=> Model.Categories.FirstOrDefault().Name);
            </th>
            <th></th>
        </tr>
    </thead>
    <tbody>
@foreach (var item in Model.Animals) {
        <tr>
            <td>
                @Html.DisplayFor(modelItem => item.Name)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.BirthDate)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.Description)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.PhotoUrl)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.Category.Name)
            </td>
            <td>
                <a asp-action="Edit" asp-route-id="@item.AnimalId">Edit</a> |
                <a asp-action="Details" asp-route-id="@item.AnimalId">Details</a> |
                <a asp-action="Delete" asp-route-id="@item.AnimalId">Delete</a>
            </td>
        </tr>
}
    </tbody>
</table>

您必须在 _animalService.GetAllAsync()

中包含类别
return await _context.Animals.Include(i => i.Category);

恕我直言,我看不出你需要什么 IQueryable<Category> Categories。也许您也必须将 IQueryable 更改为 IEnumerable