【问题标题】:Good practices and use of DateTime in List of ViewModelsViewModel 列表中 DateTime 的良好做法和使用
【发布时间】:2020-08-03 23:44:24
【问题描述】:

我正在为客户做一个系统,他没有使用全日历,这将是实用的。有了这个,我在一个表中创建了一个包含 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; }
}

和客户:

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 点到晚上 10 点返回:

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>

}

只有使用议程表,我才能在视图中显示“可导航”日历,如图所示:

仍然在 Reservation 表中,我有一个 ClienteId 字段,我在其中返回一个特定的客户。在我为 ViewModel 制作的列表中,我使用了一个调用 Reservation 和 Customers 表的 foreach,如图所示:

这样做的问题是,执行此操作时,视图停止显示从早上 6 点到晚上 10 点的整个列表,它只显示安排客户的字段。我的目标是至少以这种方式离开它:

我怎样做才能实现这个目标:和/或另一个:有没有其他方法可以在不使用数据库的热门日期的情况下做到这一点?

【问题讨论】:

    标签: c# datetime asp.net-core asp.net-mvc-viewmodel


    【解决方案1】:

    您似乎想显示ClientNome

    首先,从您预期的结果图像来看,AgendaReserva 之间应该是一对多的关系。然后您可以获取多个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; }
    }
    

    查看:

        <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();
    }
    

    结果:

    【讨论】:

    • 谢谢,您的回答大大阐明了我的理解。从现在开始,我所要做的就是使用 来返回一对多,以防万一
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-25
    • 1970-01-01
    • 1970-01-01
    • 2016-04-29
    • 1970-01-01
    • 2023-03-16
    相关资源
    最近更新 更多