NetCore w jaki sposób odczytywać dane z Dictionary w widoku?

0

Witam serdecznie.

Tworzę tabelę rezerwacji posortowanych salami/godzinami.
screenshot-20201214234530.png

Wykorzystuję do tego metodę z serwisu RoomReservationService

public interface IRoomReservationService
{
        /// <summary>
        /// Zwraca rezerwacje z danego dnia <paramref name="dateTime"/>. 
        /// Kluczem jest identyfikator <see cref="Guid"/> sali w bazie danych.
        /// Wartością jest słownik godzin z danego dnia i rezerwacji do niego przynależących.
        /// Kluczem w tym słowniku jest godzina <see cref="int"/> z zakresu 10-21
        /// Wartością jest <see cref="IEnumerable{RoomReservation}"/> zawierającą wszystkie rezerwacje z danego dnia, sali i godziny
        /// </summary>
        /// <param name="dateTime">Dzień dla którego zostaną wygenerowane rezerwacje</param>
        /// <returns><see cref="Dictionary{Guid, Dictionary{int, IEnumerable{RoomReservation}}}"/></returns>
        Dictionary<Guid, Dictionary<int, IEnumerable<RoomReservation>>> CollectDayReservation(DateTime dateTime);
}
public class RoomReservationService : IRoomReservationService
{
        public Dictionary<Guid, Dictionary<int, IEnumerable<RoomReservation>>> CollectDayReservation(DateTime dateTime)
        {
            List<RoomReservation> allReservations = _dbContext.RoomReservations.Where(x => x.ReservationTime.CompareTo(dateTime.Date) >= 0 && x.ReservationTime.CompareTo(dateTime.Date.AddHours(21)) <= 0).ToList();

            Dictionary<Guid, Dictionary<int, IEnumerable<RoomReservation>>> RoomReservations = new Dictionary<Guid, Dictionary<int, IEnumerable<RoomReservation>>>();
            List<Room> rooms = _roomService.ActiveRooms;
            foreach(Room room in rooms)
            {
                Dictionary<int, IEnumerable<RoomReservation>> reservations = new Dictionary<int, IEnumerable<RoomReservation>>();
                for(int n=10; n<=21; n++)
                    reservations.Add(n, allReservations.Where(x => x.ReservationTime.Hour == n && x.RoomId == room.ID));
                RoomReservations.Add(room.ID, reservations);
            }
            return RoomReservations;
        }
}

Teraz w widoku DayReservations.cshtml

@model DateTime
@{
    ViewData["Title"] = "Dzienne rezerwacje";
    ViewData["ActivePage"] = Muzostacja.Data.ManageNavPagesData.Nav_PanelRezerwacji.Index;
    Layout = "_Layout_PanelRezerwacji";

    var CurrentUser = await UserManager.GetUserAsync(User);
    List<Room> Rooms = _roomService.ActiveRooms;

    Dictionary<Guid, Dictionary<int, IEnumerable<RoomReservation>>> DayReservations = _roomReservationService.CollectDayReservation(Model);

}

// Kod został skrócony

<table class="table">
        <thead>
            <tr>
                <th>
                    Sala
                </th>
                @for (int n = 10; n <= 21; n++)
                {
                    <th>
                        @(n.ToString())
                    </th>
                }
            </tr>
        </thead>
        <tbody>
            @foreach (Room room in Rooms)
            {
                <tr>
                    <td>
                        @Html.DisplayFor(modelItem => room.Name);
                    </td>
                    @for (int n = 10; n <= 21; n++)
                    {
                        <td>
                            @Html.DisplayFor(modelItem => DayReservations[room.ID][n].Count().ToString());
                        </td>
                    }
                </tr>
            }
        </tbody>
    </table>

Gdy dodałem linijkę @Html.DisplayFor(modelItem => DayReservations[room.ID][n].Count().ToString()); otrzymuję po zwróceniu widoku z kontrolera ExceptionPage

An unhandled exception occurred while processing the request.
InvalidOperationException: Templates can be used only with field access, property access, single-dimension array index, or single-parameter custom indexer expressions.
Microsoft.AspNetCore.Mvc.ViewFeatures.ExpressionMetadataProvider.FromLambdaExpression<TModel, TResult>(Expression<Func<TModel, TResult>> expression, ViewDataDictionary<TModel> viewData, IModelMetadataProvider metadataProvider)

Mogę Was prosić o pomoc w wyświetleniu danych z tego słownika w tabeli?

0

Zawsze możesz użyć "czystego" HTMLa zamiast helperów z ASP :)

0

Ale wtedy jak się odwołać z czystego HTMLa do tego słownika? Muszę go przekonwertować na JSONa czy jak?

1

@Grzegorz Świdwa:

nie wiem jak ci odpowiedzieć poza "zwyczajnie", haha.

Spróbuj np. tak

@for (int n = 10; n <= 21; n++)
{
	<td>
		@DayReservations[room.ID][n].Count()
	</td>
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1