You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 16:37:52