Я пытаюсь перейти от использования модели MVC к Razor Pages, но у меня возникают проблемы с отображением данных из моей базы данных в таблицу.Проблема в том, что на странице Razor я не могу использовать foreach, потому что в модели нет GetEnumerator, и использование @model IEnumerable<...>
вызывает исключение при вызове страницы, говоря, что нет конструктора для типа «ModelName», даже если вMVC это работает.
В MVC я сделал это так, и все работает нормально:
Контроллер
public IActionResult ViewMenu()
{
IList<ServixModel.MenuModel> menu = null;
using (_context)
{
menu = _context.Menu.Select(m => new ServixModel.MenuModel()
{
Id = m.Id,
Id_Parent = m.Id_Parent,
Testo = m.Testo,
Link = m.Link,
SortOrder = m.SortOrder
}).ToList<ServixModel.MenuModel>();
}
return View(menu);
}
Вид
@model IEnumerable<servix_test1.Models.ServixModel.MenuModel>
@{
ViewData["Title"] = "ViewMenu";
}
<h1>ViewMenu</h1>
<table style="border:solid 1px black;">
<tr>
<th>
@Html.DisplayNameFor(model => model.Id)
</th>
<th>
@Html.DisplayNameFor(model => model.Id_Parent)
</th>
<th>
@Html.DisplayNameFor(model => model.Testo)
</th>
<th>
@Html.DisplayNameFor(model => model.Link)
</th>
<th>
@Html.DisplayNameFor(model => model.SortOrder)
</th>
</tr>
@foreach (var item in Model)
{
<tr>
<td>
@Html.DisplayFor(modelItem => item.Id)
</td>
<td>
@Html.DisplayFor(modelItem => item.Id_Parent)
</td>
<td>
@Html.DisplayFor(modelItem => item.Testo)
</td>
<td>
@Html.DisplayFor(modelItem => item.Link)
</td>
<td>
@Html.DisplayFor(modelItem => item.SortOrder)
</td>
</tr>
}
</table>
ИспользованиеRazor Pages Мне пришлось немного его изменить:
ViewMenu.cshtml
@page
@model servix2.Models.Servix2Model.MenuModel
@{
ViewData["Title"] = "ViewMenu";
Layout = "~/Pages/Shared/_Layout.cshtml";
}
<h1>ViewMenu</h1>
<table>
<thead>
@Html.DisplayNameFor(model => model)
</thead>
<thead>
@Html.DisplayNameFor(model => model.Id_Parent)
</thead>
<thead>
@Html.DisplayNameFor(model => model.Link)
</thead>
<thead>
@Html.DisplayNameFor(model => model.SortOrder)
</thead>
<thead>
@Html.DisplayNameFor(model => model.Testo)
</thead>
@foreach (var item in Model) //Error here
{
<tr>
<td>
@Html.DisplayNameFor(modelItem => item.Id)
</td>
<td>
@Html.DisplayNameFor(modelItem => item.Id_Parent)
</td>
<td>
@Html.DisplayNameFor(modelItem => item.Link)
</td>
<td>
@Html.DisplayNameFor(modelItem => item.SortOrder)
</td>
<td>
@Html.DisplayNameFor(modelItem => item.Testo)
</td>
</tr>
}
</table>
ViewMenu.cshtml.cs
public class ViewMenuModel : PageModel
{
private readonly Servix2DbContext _context;
public ViewMenuModel(Servix2DbContext context)
{
_context = context;
}
public IList<MenuModel> Menu { get; set; }
public async Task OnGetAsync()
{
Menu = await _context.Menu.AsNoTracking().ToListAsync();
}
}
Если вы считаете, что код написан плохои я могу что-то улучшить, просто дайте мне знать.
Спасибо всем, кто готов помочь.