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

如何将包含日期时间值的ViewData赋值到Razor视图的datetime-local输入框

核心原因

HTML5 标准中type="datetime-local"的输入框对value属性的格式有强制要求,必须为 yyyy-MM-ddTHH:mm 格式的字符串(属于ISO 8601规范,中间的T必须为大写),如果传入的日期字符串不符合该格式,浏览器会直接判定为非法值,自动清空输入框内容,也就是你看到的赋值不生效的情况。
你在JS中可以正常获取到值,也侧面说明值本身已经传递到前端,只是格式不符合输入框的要求。

解决方案

方案1:后端存入ViewData前先格式化

修改Controller中的赋值逻辑,将日期提前转成符合要求的格式:

// 先做非空校验避免转换报错
if (!string.IsNullOrEmpty(formcollection.fromDate))
{
    ViewData["fromDate"] = Convert.ToDateTime(formcollection.fromDate).ToString("yyyy-MM-ddTHH:mm");
}

cshtml端不需要修改原有代码即可正常显示。

方案2:Razor视图渲染时格式化

如果不方便修改后端代码,可以直接在cshtml中对值做格式转换:

<input type="datetime-local" id="fromDate" 
       value="@(ViewData["fromDate"] != null ? Convert.ToDateTime(ViewData["fromDate"]).ToString("yyyy-MM-ddTHH:mm") : string.Empty)" />

方案3:通过JS赋值(适合已经在JS中拿到值的场景)

因为你已经可以在JS中正常获取到ViewData的值,可以在页面加载完成后处理格式再赋值给输入框:

document.addEventListener('DOMContentLoaded', function(){
    const rawDateStr = '@ViewData["fromDate"]';
    if (!rawDateStr) return;
    // 转换为本地时间格式的符合要求的字符串
    const date = new Date(rawDateStr);
    const padZero = num => num.toString().padStart(2, '0');
    const formattedDate = `${date.getFullYear()}-${padZero(date.getMonth()+1)}-${padZero(date.getDate())}T${padZero(date.getHours())}:${padZero(date.getMinutes())}`;
    document.getElementById('fromDate').value = formattedDate;
});

这里手动拼接本地时间的逻辑是为了避免toISOString()自动转UTC时间导致的时差问题,如果你的业务不需要考虑时区差异,直接用date.toISOString().slice(0,16)也可以。

注意事项
  • 不要使用带斜杠、中文的日期格式,比如yyyy/MM/dd HH:mm、yyyy年MM月dd日等,datetime-local输入框完全不识别这类格式
  • 涉及日期转换的逻辑都建议先做非空、合法性校验,避免转换异常报错

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 10:09:03