如何将ASP.NET Model的DateTime值存入数组用于Google Chart API
解决ASP.NET Model DateTime转JavaScript数组的语法错误问题
我明白你遇到的困扰了——直接把ASP.NET Model里的DateTime值塞到JS的Date构造函数里时,总会触发"缺少')'"的语法错误,这其实是因为ASP.NET输出的日期格式没被正确处理,导致JS引擎解析时卡壳了。
问题根源
你之前写的@:dates.push(new Date(@s.Date))会让ASP.NET直接输出类似new Date(01/05/2024 14:30:00)这样的代码,这在JS里完全不合法:日期字符串没被引号包裹,斜杠和空格会被当成运算符,JS自然会报错。而数字类型的@i能正常运行,是因为输出的是纯数字,完全符合JS语法规范。
两种可行的解决方案
方案1:输出ISO 8601标准格式的日期字符串
ASP.NET的DateTime可以通过ToString("o")输出标准的ISO 8601格式字符串,这种格式能被JS的Date构造函数完美识别,只要记得用引号把它包裹起来就行:
var dates = []; @foreach (var s in Model.Scores) { // 用ISO格式字符串创建JS Date对象 @:dates.push(new Date('@s.Date.ToString("o")')); }
方案2:转成JS Date支持的UTC毫秒数
JS的Date构造函数还能接受从1970年1月1日UTC开始计算的毫秒数,我们可以在ASP.NET里先把DateTime转成这个数值,直接输出给JS:
var dates = []; @foreach (var s in Model.Scores) { // 计算UTC毫秒数并创建JS Date对象 var milliseconds = (int)(s.Date.ToUniversalTime() - new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc)).TotalMilliseconds; @:dates.push(new Date(@milliseconds)); }
这种方法不需要处理字符串引号,而且用ToUniversalTime()统一转成UTC时间,能更好地避免时区差异带来的问题。
为什么你之前的String写法不行?
你尝试的String(@s.Date)之类的写法,本质上还是输出了未加引号的日期字符串,比如String(01/05/2024 14:30:00),同样会触发JS语法错误。必须把日期值用引号包裹成合法的JS字符串,才能被正确解析。
内容的提问来源于stack exchange,提问作者coolhand
相关产品推荐
相关产品推荐

