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

.NET6 EF6 Razor Pages(非MVC)按模型值修改div innerHTML异常

问题原因

当前代码存在两个核心错误,才会出现只有第一行截止日期被显示为"None"的异常:

  • 违反HTML id唯一性规则:你在foreach循环中给每一行的截止日期容器都设置了相同的id="due-date",按照HTML规范,同一页面内id必须全局唯一,document.querySelector('#due-date')永远只会匹配页面上第一个带该id的元素,剩余所有行的截止日期div根本不会被JS获取到。
  • JS条件判断语法错误:if判断中误用了赋值运算符=,而非严格相等比较运算符===。代码if (dueDateDiv.innerHTML = "09/09/9999")并不会判断div内容是否为目标日期,而是直接把选中的第一个div的内容强制赋值为09/09/9999,且赋值表达式返回的非空字符串会被判定为真值,直接进入分支把内容改成"None",完全忽略该div原本的实际日期值。
修复方案

提供两种可选修复方案,优先推荐服务端渲染时直接处理,无需额外写JS,也不会出现页面加载后内容闪变的问题。

方案1:服务端直接渲染(推荐)

直接修改Razor视图中截止日期的渲染逻辑,输出页面时就完成值判断,不需要额外前端脚本:

<td width="10%">
    <div class="due-date">
        @if (obj.DueDate == new DateTime(9999, 9, 9))
        {
            @:None
        }
        else
        {
            @obj.DueDate.ToString("MM/dd/yyyy")
        }
    </div>
</td>

注意:循环生成的重复元素建议用class做标识,不要用id,从根源避免id重复的规范问题。

方案2:修复前端JS逻辑

如果确实需要在前端处理,先把循环内div的id替换为class,避免id重复:

<td width="10%">
    <div class="due-date">@obj.DueDate.ToString("MM/dd/yyyy")</div>
</td>

再修改JS逻辑,选中所有截止日期元素逐个判断,注意使用正确的比较运算符,且等DOM加载完成后再执行函数:

function hideDueDate () {
    // 选中所有截止日期容器
    const dueDateDivs = document.querySelectorAll('.due-date');
    dueDateDivs.forEach(div => {
        // 用===做严格相等比较,禁止误用=赋值
        if (div.innerHTML.trim() === "09/09/9999") {
            div.innerHTML = "None";
        }
    })
}
// DOM加载完成后再执行逻辑,避免元素未渲染完成导致的获取失败
document.addEventListener('DOMContentLoaded', hideDueDate);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 19:30:17