在 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
。
我正在使用 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
。