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

ASP.NET MVC如何按当日日期筛选视图数据并解决传参问题

按当日日期筛选业务数据的实现方案

当前实现存在3个核心问题:

  • 当日日期不需要通过前端链接传参,也不需要存入Session绕路传递,后端直接获取服务器当前日期即可,能彻底避免传值丢失、格式解析错误、客户端时间不准的问题
  • 之前存入Session时调用ToShortDateString()转成了区域相关的短日期字符串,不同服务器区域配置下短日期格式差异很大,Convert.ToDateTime解析时极易出现格式不匹配,返回错误日期导致查询无结果
  • 如果数据库DATE列是带时分秒的datetime类型,直接和日期值做相等判断会匹配不到当日0点之后的所有数据

推荐实现(最稳定,无需前端传日期)

直接修改控制器逻辑,给CountDate设置可空默认值,未传参时默认取当日日期,不需要在视图按钮里传CountDate,也不需要依赖Session:

public ActionResult Edit(int programId, int hospitalNo, DateTime? CountDate = null)
{
    // 未传入日期时默认取服务器当日0点,不受客户端时间影响
    DateTime targetDate = CountDate ?? DateTime.Today;
    // 用时间范围查询兼容带时分秒的日期列,避免相等匹配失败
    var stat = _context.STATISTICS
        .Where(d => d.program_id == programId
                    && d.hospital_no == hospitalNo
                    && d.DATE >= targetDate
                    && d.DATE < targetDate.AddDays(1))
        .ToList();
    return View(stat);
}

对应视图中的跳转按钮直接移除CountDate传参即可:

@Html.ActionLink("Statistics", "Edit", "Statistics",
    new { programId = item.program_id, hospitalNo = item.hospital_id },
    new { @class = "btn btn-info" })

兼容自定义日期传参的实现

如果后续需要支持传入任意日期筛选,不要在Session中存日期字符串,直接存储DateTime类型避免格式解析错误:

  1. 登录赋值Session时直接存日期类型,不要做字符串转换:
// 存储当日0点的DateTime类型值
Session["LoginDate"] = DateTime.Today;
  1. 视图中取Session值时做显式类型强转,不要用Convert.ToDateTime做不确定格式的解析:
@Html.ActionLink("Statistics", "Edit", "Statistics",
    new
    {
        programId = item.program_id,
        hospitalNo = item.hospital_id,
        CountDate = (DateTime)Session["LoginDate"]
    },
    new { @class = "btn btn-info" })

注意:如果项目用了分布式部署、多节点负载均衡,需要提前配置Session持久化,否则会出现偶发的Session丢失导致传参失败,这种场景下优先选第一种后端直接取日期的方案。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 04:06:07