有没有办法让 DateTime 属性 在您使用 MVC 编辑其对象时保持不变?

Is there a way to make a DateTime property stay constant, as you edit its object with an MVC?

我不知道该怎么做。我的票证对象有一个名为 TicketCreationTime 的 DateTime 属性,它表示 属性 默认为 1/1/0001 凌晨 12 点;每次从门票控制器调用它的编辑实体功能时。

如何才能使 TicketCreationTime 与票证对象的更改保持一致?那样的话,创建时间就是制作票的时间了?

工单对象

public class Ticket
{
    public int ID { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }
    public DateTime TicketCreationTime { get; set; } 
    public DateTime DueDate { get; set; }
    public DateTime TicketUpdatedTime { get; set; } 

    public Ticket()
    {
    }
}

TicketsController 创建

public async Task<IActionResult> Create([Bind("ID,Name,Description,TicketCreationTime,DueDate,TicketUpdatedTime,CurrentStatus,Importance")] Ticket ticket)
{
    if (ModelState.IsValid)
    {
        DateTime StartTime = DateTime.Now;

        ticket.TicketCreationTime = StartTime;
        ticket.TicketUpdatedTime = StartTime;
        _context.Add(ticket);
        await _context.SaveChangesAsync();
        return RedirectToAction(nameof(Index));
    }
    return View(ticket);
}

TicketsController 编辑

public async Task<IActionResult> Edit(int id, [Bind("ID,Name,Description,TicketCreationTime,DueDate,TicketUpdatedTime,CurrentStatus,Importance")] Ticket ticket)
{
    if (id != ticket.ID)
    {
        return NotFound();
    }

    if (ModelState.IsValid)
    {
        try
        {
            ticket.TicketUpdatedTime = DateTime.Now;
            _context.Update(ticket);
            await _context.SaveChangesAsync();
        }
        catch (DbUpdateConcurrencyException)
        {
            if (!TicketExists(ticket.ID))
            {
                return NotFound();
            }
            else
            {
                throw;
            }
        }
        return RedirectToAction(nameof(Index));
    }
    return View(ticket);
}

对 TicketCreationTime 使用 DateTime? 而不是 DateTime。如果它为空则更新它:

ticket.TicketUpdatedTime = DateTime.Now;

if (ticket.TicketCreationTime is null)
{
    ticket.TicketCreationTime = ticket.TicketUpdatedTime;
}

这个问题正是应用 模型 概念有用的原因,您也可以将其识别为 "M" MVC.

模型 class/object 可以看起来像 EF 实体 class/object,但它与实际数据库内容分开存在。

模型可用于显示数据(您可能并不总是希望显示所有数据,或者您可能希望以其他存储方式显示数据) and/or 模型可用于处理从呈现的网页接收 的数据。

在这种情况下,模型 class 将具有实体 class 的大部分属性,Ticket....Time 属性除外。当收到 Edit POST 命令时,您需要从 DbContext 中检索 Entity 对象,使用 Model 对象中的属性更新它,然后保存 Entity 对象。

示例代码:

public class TicketUpdateModel
{
    public int ID { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }
    public DateTime DueDate { get; set; }
}

[HttpPost]
public async Task<IActionResult> Edit(TicketUpdateModel model)
{
    var ticket = await _context.Tickets.FindAsync(model.ID);
    if (ModelState.IsValid)
    {
        try
        {
            ticket.TicketUpdatedTime = DateTime.Now;
            ticket.Name = model.Name;
            ticket.Description = model.Description;
            ticket.DueDate = model.DueDate;
            await _context.SaveChangesAsync();
        }
        catch (DbUpdateConcurrencyException)
        {
            // ....
        }
        return RedirectToAction(nameof(Index));
    }
    return View(ticket); // or perhaps use a TicketDisplayModel class
}