ASP.NET Core MVC中资产分配记录创建时的日期迁移、历史展示及日期校验实现方案咨询
资产分配管理需求解决方案
我来帮你一步步解决这三个资产分配管理的需求,结合你现有的代码做针对性调整:
1. 实现历史分配信息展示
要展示资产的历史分配区间,核心是利用已有的AssigningAssetModel记录(它保存了每一次的分配操作),在资产详情页中关联查询并处理这些记录。
调整步骤:
- 首先建议把模型中的日期字段从
string改为DateTime,避免字符串解析错误:
// 修改AssigningAssetModel的Date字段 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 DateTime Date { get; set; } // 改为DateTime类型 } // 修改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 DateTime? AssignedToDateOld { get; set; } // 可空,第一次分配时无旧日期 public DateTime AssignedToDateNew { get; set; } }
- 修改
AssetMaster控制器的Details方法,查询对应资产的所有分配记录并排序:
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(); } // 查询该资产的所有分配记录并按日期排序 var assignmentHistory = await _context.AssigningAssetModel .Where(a => a.AssetCode == assetMasterModel.AssetCode) .OrderBy(a => a.Date) .ToListAsync(); // 把历史记录传给视图(可以用ViewModel,这里简化直接用ViewData) ViewData["AssignmentHistory"] = assignmentHistory; return View(assetMasterModel); }
- 在
Details视图中添加历史分配展示逻辑:
<!-- 资产基本信息展示后添加以下内容 --> <h4>历史分配记录</h4> @var history = (List<AssigningAssetModel>)ViewData["AssignmentHistory"]; @for (int i = 0; i < history.Count; i++) { if (i < history.Count - 1) { <p>曾于@history[i].Date.ToString("MM/dd/yy") 至 @history[i+1].Date.ToString("MM/dd/yy") 期间分配给 @history[i].EmployeeName</p> } // 如果是最后一条记录,可显示当前分配状态 else { <p>当前分配至@history[i].EmployeeName,起始日期@history[i].Date.ToString("MM/dd/yy")</p> } }
2. 实现日期迁移逻辑
在创建新分配记录时,需要把AssetMasterModel中原有的AssignedToDateNew值迁移到AssignedToDateOld,再更新新的日期。修改AssigningAsset控制器的Create方法:
[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) { // 执行日期迁移:将原New日期移到Old字段 masterExist.AssignedToDateOld = masterExist.AssignedToDateNew; // 更新新的员工和日期 masterExist.EmployeeName = assigningAssetModel.EmployeeName; masterExist.AssignedToDateNew = assigningAssetModel.Date; _context.Entry(masterExist).State = EntityState.Modified; } _context.Add(assigningAssetModel); await _context.SaveChangesAsync(); } catch (Exception ex) { return BadRequest(ex.Message); } return RedirectToAction(nameof(Index)); }
注:移除了原代码中重复的
_context.Update(assigningAssetModel)和SaveChangesAsync(),因为添加记录后已经保存过了,不需要重复操作。
3. 实现日期输入校验
在创建新分配记录时,校验输入的日期是否介于原AssignedToDateOld和AssignedToDateNew之间,添加校验逻辑到Create方法中:
[HttpPost] [ValidateAntiForgeryToken] public async Task<IActionResult> Create(int id, [Bind("ID,EmployeeName,AssetCode,Date")] AssigningAssetModel assigningAssetModel) { if (id != assigningAssetModel.ID) return NotFound(); var masterExist = await _context.Set<AssetMasterModel>() .FirstOrDefaultAsync(i => i.AssetCode == assigningAssetModel.AssetCode); if (masterExist == null) return NotFound(); // 日期输入校验:如果存在历史区间,检查输入日期是否在区间内 if (masterExist.AssignedToDateOld.HasValue) { bool isDateInRange = assigningAssetModel.Date > masterExist.AssignedToDateOld.Value && assigningAssetModel.Date < masterExist.AssignedToDateNew; if (isDateInRange) { ModelState.AddModelError("Date", "输入的日期不得介于已有的分配日期区间内"); return View(assigningAssetModel); } } if (!ModelState.IsValid) return View(assigningAssetModel); try { if (masterExist.EmployeeName != assigningAssetModel.EmployeeName) { masterExist.AssignedToDateOld = masterExist.AssignedToDateNew; masterExist.EmployeeName = assigningAssetModel.EmployeeName; masterExist.AssignedToDateNew = assigningAssetModel.Date; _context.Entry(masterExist).State = EntityState.Modified; } _context.Add(assigningAssetModel); await _context.SaveChangesAsync(); } catch (Exception ex) { return BadRequest(ex.Message); } return RedirectToAction(nameof(Index)); }
这样就能满足你提出的三个需求:在资产详情页展示历史分配区间、自动迁移日期字段、限制输入日期的合法性。
内容的提问来源于stack exchange,提问作者Mouffaq Dalloul
相关产品推荐
相关产品推荐

