Проблема с отображением данных в таблице с помощью Razor Pages - PullRequest
0 голосов
/ 27 апреля 2019

Я пытаюсь перейти от использования модели 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();
        }
    }

Если вы считаете, что код написан плохои я могу что-то улучшить, просто дайте мне знать.

Спасибо всем, кто готов помочь.

1 Ответ

0 голосов
/ 27 апреля 2019

Мне удалось это исправить так:

Viewmenu.cshtml

@page
@model servix2.Pages.ViewMenuModel
@{
    ViewData["Title"] = "ViewMenu";
    Layout = "~/Pages/Shared/_Layout.cshtml";
}
<h1>ViewMenu</h1>

<table>
    <tr>
        <th>@Html.DisplayNameFor(x => x.Menu[0].Id)</th>        
        <th>@Html.DisplayNameFor(x => x.Menu[0].Id_Parent)</th>
        <th>@Html.DisplayNameFor(x => x.Menu[0].Link)</th>
        <th>@Html.DisplayNameFor(x => x.Menu[0].Testo)</th>
        <th>@Html.DisplayNameFor(x => x.Menu[0].SortOrder)</th>
    </tr>
    @foreach (var item in Model.Menu)
    {
        <tr>
            <td>@item.Id</td>
            <td>@item.Id_Parent</td>
            <td>@item.Link</td>
            <td>@item.Testo</td>
            <td>@item.SortOrder</td>
        </tr>
    }
</table>

ViewMenu.cshtml.cs

public class ViewMenuModel : PageModel
{

    private readonly Servix2DbContext _context;  

    public ViewMenuModel(Servix2DbContext context)
    {
        _context = context;
    }

    public List<MenuModel> Menu { get; set; }

    public async Task OnGetAsync()
    {
        Menu =  await _context.Menu.AsNoTracking().ToListAsync();
    }
}
...