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类型避免格式解析错误:
- 登录赋值Session时直接存日期类型,不要做字符串转换:
// 存储当日0点的DateTime类型值 Session["LoginDate"] = DateTime.Today;
- 视图中取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
相关产品推荐
相关产品推荐

