ASP.NET Core 7 MVC日期范围过滤失效问题求助
日期范围过滤失效问题修复
核心问题分析
- 条件分支逻辑错误:第一个
if (StartDate != null)会拦截所有StartDate非空的请求,导致后续判断StartDate和EndDate同时存在的else if永远无法触发。 - 重复数据库查询:每次过滤都重新调用
_db.TransactionsRepo.GetAll(),既冗余又影响性能,应该基于初始查询结果叠加过滤条件。 - 日期时间匹配偏差:前端提交的是纯日期(如
2024-05-20),若数据库TransactionDate包含时间,<= EndDate会漏掉当天所有非零点的记录。 - 筛选值未回显:表单提交后输入框清空,用户无法直观看到当前筛选条件。
修正后的控制器代码
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
相关产品推荐
相关产品推荐

