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

ASP.NET Core 7 MVC日期范围过滤失效问题求助

日期范围过滤失效问题修复

核心问题分析

  1. 条件分支逻辑错误:第一个if (StartDate != null)会拦截所有StartDate非空的请求,导致后续判断StartDate和EndDate同时存在的else if永远无法触发。
  2. 重复数据库查询:每次过滤都重新调用_db.TransactionsRepo.GetAll(),既冗余又影响性能,应该基于初始查询结果叠加过滤条件。
  3. 日期时间匹配偏差:前端提交的是纯日期(如2024-05-20),若数据库TransactionDate包含时间,<= EndDate会漏掉当天所有非零点的记录。
  4. 筛选值未回显:表单提交后输入框清空,用户无法直观看到当前筛选条件。

修正后的控制器代码

public TransactionsVM transactions = new();

public IActionResult Transactions(DateTime? StartDate, DateTime? EndDate)
{
    var claimsIdentity = (ClaimsIdentity)User.Identity;
    var claims = claimsIdentity.FindFirst(ClaimTypes.NameIdentifier);

    transactions.AccountUser = _db.ApplicationUserRepo.GetOne(x => x.Id == claims.Value);
    transactions.BankAccount = _db.BankAccountRepo
        .GetOne(x => x.Id == transactions.AccountUser.BankAccountId);
    
    // 初始查询:获取当前用户账户的所有交易
    IEnumerable<Transactions> transList = _db.TransactionsRepo
        .GetAll().Where(x => x.BankAccountId == transactions.BankAccount.Id);

    // 叠加过滤条件,避免重复查询
    if (StartDate.HasValue)
    {
        transList = transList.Where(j => j.TransactionDate >= StartDate.Value);
    }

    if (EndDate.HasValue)
    {
        // 将EndDate转为当天最后一刻,确保包含当天所有带时间的记录
        var endOfDay = EndDate.Value.Date.AddDays(1).AddTicks(-1);
        transList = transList.Where(j => j.TransactionDate <= endOfDay);
    }

    // 将过滤后的列表赋值到视图模型(需确保TransactionsVM有对应属性)
    transactions.TransactionList = transList;
    // 传递筛选条件到视图用于回显
    transactions.StartDate = StartDate;
    transactions.EndDate = EndDate;

    return View(transactions);
}

修正后的视图代码

<form asp-action="Transactions">
    <div class="row mt-3 mb-3">
        <div class="col-lg-5">
            <label class="form-label">Start Date</label>
            <!-- 回显已选择的开始日期 -->
            <input type="date" name="StartDate" class="my-form-control" 
                   value="@Model.StartDate?.ToString("yyyy-MM-dd")" />
        </div>
        <div class="col-lg-5">
            <label class="form-label">End Date</label>
            <!-- 回显已选择的结束日期 -->
            <input type="date" name="EndDate" class="my-form-control" 
                   value="@Model.EndDate?.ToString("yyyy-MM-dd")" />
        </div>
        <div class="col-lg-2 my-auto">
            <button type="submit" class="w-100 btn bg-green text-light">Filter</button>
        </div>
    </div>
</form>

额外说明

  • 需确保TransactionsVM中添加StartDate、EndDate和TransactionList属性,用于传递筛选条件和结果到视图。
  • 如果使用EF Core,建议将IEnumerable改为IQueryable,过滤条件会被翻译成SQL在数据库层面执行,性能更优。

内容的提问来源于stack exchange,提问作者Maureen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 23:58:24