ASP.NET C# Razor视图工单到期倒计时刷新后数值不变问题咨询
问题原因
- 倒计时计算逻辑颠倒:当前使用
DateTime.Today - 工单截止日期的顺序计算时间差,未到截止日期时得到的是负的TimeSpan,后续通过格式化字符串取天数时默认丢失了负号,取到绝对值的天数值,所以新增工单时(截止次日)刚好得到1,显示正常;但进入次日之后,负差值的符号依旧丢失,不会触发到期、过期的判断分支,就会一直显示旧的剩余天数。 - 时间差值取值方式错误:将TimeSpan强制转成"dd"格式字符串再转十进制数的写法完全多余,非常容易出转换错误;而且TimeSpan的"dd"格式仅取整数天部分,不会保留差值的正负属性,进一步加剧了计算错误。
- 代码存在语法错误:一是剩余天数大于1的分支中,span结束标签漏写
<,错误写为days/span>;二是TimeToEnd ==1的分支结束后漏写闭合大括号},会导致后续else分支的判断逻辑完全错乱。 - 页面缓存导致渲染结果未更新:如果修复代码逻辑后问题仍然存在,大概率是页面开启了服务器端输出缓存,或者客户端浏览器缓存了旧的页面内容,刷新时没有请求最新的渲染结果。
修复方案
首先替换为修正后的Razor代码:
// 正确计算剩余天数:用截止日期减去当前日期,直接取总天数向下取整 var remainingDays = (int)Math.Floor((work.DateOfWorkCompletion.Value - DateTime.Today).TotalDays); <h2> @Html.ActionLink(work.Name, "Details", new { work.WorkId }, new { style = "text-decoration: none; color:black;" }) <span class="timeAlert"> - @if (remainingDays > 1) { <span>end of offer in @remainingDays days</span> } else if (remainingDays == 1) { <span class="text-danger">end of offer in @remainingDays day</span> } else if (remainingDays == 0) { <span class="text-danger">the offer ends today</span> } else { <span class="text-danger">offer has expired</span> } </span> </h2>
修复说明:
- 修正计算逻辑:调整为「截止日期减当前日期」的计算顺序,直接读取TimeSpan的
TotalDays属性获取完整的天数差值,不需要转字符串再转类型,既简化代码又避免了符号丢失、格式转换错误的问题。 - 修复所有语法错误:补全span的闭合标签、补全if分支的闭合大括号,同时调整判断顺序,符合常规的倒计时展示逻辑。
- 缓存问题处理:如果修复代码后刷新页面仍未生效,先按
Ctrl+F5强制跳过浏览器缓存加载最新页面;如果还是无效,检查服务端该页面的输出缓存配置,关闭该页面的缓存或者添加每天自动更新的缓存失效规则。
内容的提问来源于stack exchange,提问作者user16014328
相关产品推荐
相关产品推荐

