Witam serdecznie.
Tworzę tabelę rezerwacji posortowanych salami/godzinami.
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?