首页 > 解决方案 > 当日期字段为空时,实体框架 asp net MVC 错误它会在编辑操作期间覆盖现有日期

问题描述

我为 CRUD 项目创建了脚手架控制器,但存在一个错误。当我为 MySql DB 创建新实体(记录)时,它按预期工作,其中一个值是 HiredDate。但是,当我在不同的视图中编辑某些东西时,例如 FiredDate 它会覆盖以前为 HiredDate 创建的记录并将其设置为 0001-01-01 。

这是模型的代码:

        [Column("City", TypeName = "varchar(100)")]
        public string City { get; set; }

        [Required]
        [Column("Department", TypeName = "varchar(100)")]
        public string Department { get; set; }

        [Required]
        [Column("HiredDate", TypeName = "date")]
        [Display(Name = "Hired On")]
        public DateTime HiredDate { get; set; }

        [Column("FiredDate", TypeName = "date")]
        [Display(Name = "Fired On")]
        public DateTime? FiredDate { get; set; }

        [Required]
        [Column("ModifiedDate", TypeName = "datetime")]
        [Display(Name = "Modified Date")]
        public DateTime ModifiedDate { get; set; }

控制器代码编辑

   public async Task<IActionResult> Edit(int id, [Bind("ID,FirstName,LastName,Email,Phone,Age,City,Department,FiredDate")] Employee employee)
        {
            if (id != employee.ID)
            {
                return NotFound();
            }

            if (ModelState.IsValid)
            {
                try
                {
                    _context.Update(employee);
                    await _context.SaveChangesAsync();
                }
                catch (DbUpdateConcurrencyException)
                {
                    if (!EmployeeExists(employee.ID))
                    {
                        return NotFound();
                    }
                    else
                    {
                        throw;
                    }
                }
                return RedirectToAction(nameof(Index));
            }
            return View(employee);
        }

和用于创建的控制器代码:

   public async Task<IActionResult> Create([Bind("FirstName,LastName,Email,Phone,Age,City,Department,HiredDate")] Employee employee)
        {
            if (ModelState.IsValid)
            {
                _context.Add(employee);
                await _context.SaveChangesAsync();
                return RedirectToAction(nameof(Index));
            }
            return View(employee);
        }

覆盖的结果如下所示: 在此处输入图像描述

我该如何解决?当我执行编辑操作并修改除 HiredDate 之外的任何其他字段时,我希望 HiredDate 保持不变(例如 2020-01-01)。

标签: mysqlasp.net-mvcentity-frameworkdatetimedata-binding

解决方案


没关系,我发现了这个问题,这个 BIND 确实不是用户友好的,它迫使开发人员在视图中显示所有字段,如果缺少一个字段,它将用空值覆盖缺少的字段。解决方案在编辑视图表单中。此表单应显示您的模型拥有的所有字段。


推荐阅读