【发布时间】:2021-05-19 15:20:55
【问题描述】:
例如,我在分配的资产中创建了一条记录,其中包含资产代码 (lap001)、员工姓名 (hana) 和日期 (08/10/21)。
然后我创建了另一条具有相同资产代码 (lap001) 不同员工姓名 (lana) 和日期 (09/10/21) 的记录。换句话说,我已将此资产分配给不同的员工。
在该特定资产代码 (lap001) 屏幕的资产主数据详细信息中,如何显示该特定资产从上一个日期 (08/10/21) 到新日期 (09/10/21) 分配给该员工。
目前,AssigningAssetModel 中的日期现在已分配给 AssignedToDateNew,当我创建新记录时如何将新日期移至旧日期,以及如何防止用户将前一个日期 (08/10/21) 与新日期之间的日期(09/10/21)
AssigningAssetModel 类:
public class AssigningAssetModel
{
[key]
public int ID { get; set; }
[Required(ErrorMessage = "Enter Employee Name")]
public string EmployeeName {get; set; }
[Required(ErrorMessage = "Enter AssetCode")]
public string AssetCode { get; set; }
[Required(ErrorMessage = "Enter Date")]
public string Date{ get; set; }
}
AssetMasterModel 类:
public class AssetMasterModel
{
[Key]
public int ID { get ;set; }
[Required(ErrorMessage = "Enter AssetCode")]
public string AssetCode { get; set; }
[Required(ErrorMessage = "Enter Employee Name")]
public string EmployeeName{ get; set; }
public string AssignedToDateOld { get; set; }
public string AssignedToDateNew { get; set; }
}
AssigningAsset控制器:
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Create(int id, [Bind("ID,EmployeeName,AssetCode,Date,")] AssigningAssetModel assigningAssetModel)
{
if (id != assigningAssetModel.ID)
return NotFound();
if (!ModelState.IsValid)
return View(assigningAssetModel);
try
{
var masterExist = await _context.Set<AssetMasterModel>()
.FirstOrDefaultAsync( i => i.AssetCode == assigningAssetModel.AssetCode);
if (masterExist == null)
return NotFound();
if (masterExist.EmployeeName != assigningAssetModel.EmployeeName)
{
masterExist.EmployeeName = assigningAssetModel.EmployeeName;
masterExist.AssignedToDateNew = assigningAssetModel.Date;
_context.Entry(masterExist).State=EntityState.Modified;
}
_context.Add(assigningAssetModel);
await _context.SaveChangesAsync();
_context.Update(assigningAssetModel);
await _context.SaveChangesAsync();
}
catch (Exception ex)
{
return BadRequest(ex.Message);
}
return RedirectToAction(nameof(Index));
}
AssetMaster控制者:
public async Task<IActionResult> Details(int? id)
{
if (id == null)
{
return NotFound();
}
var assetMasterModel = await _context.AssetMaster
.FirstOrDefaultAsync(m => m.ID == id);
if (assetMasterModel == null)
{
return NotFound();
}
return View(assetMasterModel);
}
所以基本上在Assigning Asset Index 中,此资产代码 (laptop0001015) 首先在 22/05/2021 分配给 Tom,然后它已在 24/05/2021 分配给 Mouffaq,现在在资产管理器中如何显示此资产代码此案例 (Laptop0001015) 从 22/05/2021 到 24/05/2021 分配给 Tom
【问题讨论】:
-
很抱歉,很难理解您需要什么。您能否发布一个详细示例,在添加新记录之前是什么值,之后您希望看到什么值?
-
很难理解你在问什么,但有几个严重的问题。对于初学者来说,
DateTime是一种二进制类型,它没有格式。没有充分的理由使用string来存储日期。其次,两位数的年份重新引入了 2000 年,仅在劳埃德和苏格兰皇家银行等主要银行下线后一年,20被视为1920。绝对没有理由在 2021 年使用两位数年份。 -
使用字符串而不是 DateTime 会使查询变得非常困难,如果不是不可能的话。对于初学者来说,甚至无法猜测字符串格式是什么。除非字符串是
YY/MM/DD格式,否则只能搜索完全匹配,因为数据库将使用字母(字典)排序。例如,您将无法搜索 2021 年的每个日期,或特定时期内的日期 -
另一个同样严重的错误是多次使用
await _context.SaveChangesAsync();。不要那样做。当您调用SaveChanges时,DbContext 会缓存所有更改并将它们保存在单个事务中。如果出现问题,所有更改都会自动回滚。在事务完成之前,其他连接不会看到更改。另一方面,您的代码逐个对象存储更改,这意味着其他人可以看到部分更改。如果出现问题,只会回滚一半的更改,导致数据不一致 -
@PanagiotisKanavos 我不放 DateTime 的唯一原因是因为日期是在创建记录时自动生成的,所以它不是由用户手动输入的
标签: c# .net-core asp.net-core-mvc