Передовой опыт и использование DateTime в списке ViewModels - PullRequest
1 голос
/ 04 августа 2020

Я делаю систему для клиента, и он не использовал fullcalendar, что было бы практично. При этом я создал таблицу с полями AgendaId (int) и DateAgendar (DateTime) на годы вперед (около 20000 строк).

С этим я установил следующую ViewModel:

public class AgendaAgendamentoVM
{
    public int Id { get; set; }
    public int? AgendamentoId { get; set; }
    public DateTime Date { get; set; }
    public int? ClienteId { get; set; }
    public string ClienteNome { get; set; }
}

И у меня есть вторая таблица под названием Reserva с полями:

public class Reserva
{
    public int ReservaId { get; set; }
    public int AgendaId { get; set; }

    [Required]
    public int ClienteId { get; set; }
    public string Servico { get; set; }

    public virtual Cliente Cliente { get; set; }
}

и Clients:

public class Cliente
    {
        public int ClienteId { get; set; }

        [Column(TypeName = "varchar(50)")]
        public string Nome { get; set; }

        [Column(TypeName = "varchar(50)")]
        public string Telefone { get; set; }

        [Column(TypeName = "varchar(50)")]
        public string Endereco { get; set; }

        [Column(TypeName = "varchar(50)")]
        public string Email { get; set; }

        public DateTime DataCadastro { get; set; }

    }

Код ViewModel ниже возвращается каждый день с 6 утра до 22 вечера:

IList<AgendaAgendamentoVM> _listaAgendaVM = new List<AgendaAgendamentoVM>();

    if (!String.IsNullOrEmpty(mes))
    {
        var data = DateTime.Parse(mes);
        ViewBag.Data = data;
        ViewBag.Ontem = data.AddDays(-1);
        ViewBag.Amanha = data.AddDays(1);

        var dias = await _context.Agenda
        .Where(x => x.DataAgenda >= data.AddHours(6))
        .Where(x => x.DataAgenda <= data.AddHours(22))
        .ToListAsync();


        foreach (var item in dias)
        {
            AgendaAgendamentoVM li = new AgendaAgendamentoVM();
            li.Id = item.AgendaId;
            li.Date = DateTime.Parse(item.DataAgenda.ToString());
            _listaAgendaVM.Add(li);
        }

        ViewData["ListaAgenda"] = _listaAgendaVM;
        return View();

Вид:

@{
ViewBag.Title = "Agenda";
}

<form>
<input type="date" name="mes" required /> <input type="submit" value="Enviar" />
</form>
<div class="row m-1 p-2 bg-success rounded">

<div class="col-4">
<a class="text-white" href="/Agenda/Index?mes=@String.Format("{0:d}", ViewBag.Ontem)"><</a>
</div>

<div class="col-4 text-center text-white font-weight-bolder">
@String.Format("{0:d}", ViewBag.Data)
</div>


<div class="col-4 text-right">
<a class="text-white" href="/Agenda/Index?mes=@String.Format("{0:d}", ViewBag.Amanha)">></a>
</div></div>

<ul class="list-group m-1">
@foreach (var item in ViewData["ListaAgenda"] as 
List<Camarim.Core.ViewModels.AgendaAgendamentoVM>)
{
<li class="list-group-item"><a href="#?agendaid=@item.Id">@String.Format("{0:HH:mm}", 
item.Date) - @item.ClienteNome</a></li>

}

Только с таблицей повестки дня я могу отобразить в виде «навигационный» календарь, как показано на изображении: enter image description here

Still in the Reservation table, I have a ClienteId field, where I return a specific customer. In the List I make of the ViewModel, I use a foreach calling the Reservation and Customers table, as shown in the photo: enter image description here

The problem with this is, when doing this, the view stops showing the entire list from 6 am to 10 pm, it only shows the fields where clients are scheduled. My goal was to leave it at least this way: Цель, которую я хочу достичь

Как мне достичь этой цели: и / ИЛИ другое: Есть ли другой способ сделать это без использования базы данных для популярных дат?

1 Ответ

1 голос
/ 04 августа 2020

Кажется, что вы хотите отобразить ClientNome.

Во-первых, исходя из ожидаемого изображения результата, между Agenda и Reserva должно быть отношение один-ко-многим. Тогда вы могли бы получить множественный ClientNome, чтобы отобразить его в вашем бритвенном представлении. Измените вашу модель, как показано ниже:

public class Agenda
{
    public int AgendaId { get; set; }
    public DateTime DataAgenda { get; set; }
    public List<Reserva> Reserva { get; set; }
}
public class Reserva
{
    public int ReservaId { get; set; }
    public int AgendaId { get; set; }

    [Required]
    public int ClienteId { get; set; }
    public string Servico { get; set; }

    public virtual Cliente Cliente { get; set; }
}
public class Cliente
{
    public int ClienteId { get; set; }
    [Column(TypeName = "varchar(50)")]
    public string Nome { get; set; }

    [Column(TypeName = "varchar(50)")]
    public string Telefone { get; set; }

    [Column(TypeName = "varchar(50)")]
    public string Endereco { get; set; }

    [Column(TypeName = "varchar(50)")]
    public string Email { get; set; }
    public DateTime DataCadastro { get; set; }
}
public class AgendaAgendamentoVM
{
    public int Id { get; set; }
    public int? AgendamentoId { get; set; }
    public DateTime Date { get; set; }
    public int? ClienteId { get; set; }
    public List<string> ClienteNome { get; set; }
}

View:

    <form>
    <input type="date" name="mes" required /> <input type="submit" value="Enviar" />
</form>
<div class="row m-1 p-2 bg-success rounded">

    <div class="col-4">
        <a class="text-white" href="/Agenda/Index?mes=@String.Format("{0:d}", ViewBag.Ontem)"><</a>
    </div>

    <div class="col-4 text-center text-white font-weight-bolder">
        @String.Format("{0:d}", ViewBag.Data)
    </div>


    <div class="col-4 text-right">
        <a class="text-white" href="/Agenda/Index?mes=@String.Format("{0:d}", ViewBag.Amanha)">></a>
    </div>
</div>

<ul class="list-group m-1">
    @foreach (var item in ViewData["ListaAgenda"] as List<AgendaAgendamentoVM>)
    {
        <li class="list-group-item">
            <a href="#?agendaid=@item.Id">
                @String.Format("{0:HH:mm}",
                item.Date) - @foreach (var i in item.ClienteNome)
                {
                    @i @string.Format("  ")       @*change this*@
                }
            </a>
        </li>

    }
</ul>

Контроллер:

public async Task<IActionResult> Index(string mes)
{
    IList<AgendaAgendamentoVM> _listaAgendaVM = new List<AgendaAgendamentoVM>();
    if (!String.IsNullOrEmpty(mes))
    {
        var data = DateTime.Parse(mes);
        ViewBag.Data = data;
        ViewBag.Ontem = data.AddDays(-1);
        ViewBag.Amanha = data.AddDays(1);

        var dias = await _context.Agenda
        .Where(x => x.DataAgenda >= data.AddHours(6))
        .Where(x => x.DataAgenda <= data.AddHours(22))
        .ToListAsync();


        foreach (var item in dias)
        {
            var reservas = (from p in _context.Reservas
                            join c in _context.Clientes on p.ClienteId equals c.ClienteId
                            where p.AgendaId == item.AgendaId
                            select c).ToList();
            AgendaAgendamentoVM li = new AgendaAgendamentoVM();
            li.Id = item.AgendaId;
            li.Date = DateTime.Parse(item.DataAgenda.ToString());
            li.ClienteNome = reservas.Select(a => a.Nome).ToList();
            _listaAgendaVM.Add(li);
        }

        ViewData["ListaAgenda"] = _listaAgendaVM;
        return View();
    }
    return View();
}

Результат: введите описание изображения здесь

...