模型日期属性String转DateTime异常:AJAX传参控制器得默认日期
解决AJAX传递DateTime到MVC控制器时默认日期的问题
问题根源
前端原始日期字符串格式不符合JavaScript Date构造函数的解析规则,导致生成无效Date对象,传递到控制器后模型绑定失败,最终得到DateTime的默认值01-01-0001 00:00:00。
具体解决方法
1. 手动解析日期字符串,生成有效Date对象并转成ISO格式传递
如果你的原始MDate是固定格式(比如yyyy-MM-dd),手动拆分日期部分构造Date对象,再转成MVC模型绑定能识别的ISO格式字符串:
// 假设原始MDate为"2024-05-20"格式 const dateSegments = MDate.split('-'); // 注意JavaScript的月份是0索引(0=1月,11=12月) const validDate = new Date(dateSegments[0], dateSegments[1] - 1, dateSegments[2]); var dataParams = { MDate: validDate.toISOString(), // 转成ISO格式字符串,如"2024-05-20T00:00:00.000Z" Status: "hh", CountryID: 8 };
2. 直接传递符合MVC绑定规则的日期字符串
如果能保证原始MDate字符串是MVC默认支持的格式(比如yyyy-MM-dd、MM/dd/yyyy,取决于服务器区域设置),可以直接传递字符串,不需要转成Date对象:
var dataParams = { MDate: MDate, // 确保格式为"2024-05-20"或服务器支持的格式 Status: "hh", CountryID: 8 };
3. 改用POST请求传递JSON数据(更可靠)
GET请求的URL参数容易出现格式编码问题,改用POST请求并传递JSON格式数据,模型绑定成功率更高:
const dateSegments = MDate.split('-'); const validDate = new Date(dateSegments[0], dateSegments[1] - 1, dateSegments[2]); var dataParams = { MDate: validDate.toISOString(), Status: "hh", CountryID: 8 }; $.ajax({ url: '../Monitoring/ActionGrid', type: 'POST', // 改为POST请求 async: false, contentType: "application/json", // 指定请求内容类型为JSON data: JSON.stringify(dataParams), // 将对象转为JSON字符串 cache: false, // POST请求无需缓存设置 headers: { 'Cache-Control': 'no-cache, no-store, must-revalidate', 'Pragma': 'no-cache', 'Expires': '0' }, success: function (dataResponse) { // 处理成功响应 }, error: function (data) { // 处理错误 } });
同时修改控制器方法,添加[HttpPost]特性:
[HttpPost] public JsonResult ActionGrid(ActionEntity actionEntity) { // 业务逻辑处理 }
4. 可选:修改模型的DateTime为可空类型
将模型中的MDate改为可空类型,便于排查无效日期传递的情况:
public class ActionEntity { public string CountryID { get; set; } public string Status { get; set; } public DateTime? MDate { get; set; } // 改为可空类型 }
额外注意点
- 前端AJAX配置中,原代码的
datatype: "application/json"是错误的,正确的参数是contentType: "application/json"(指定请求的内容类型),dataType是预期的响应类型(比如"html"或"json")。
内容的提问来源于stack exchange,提问作者user18048414
相关产品推荐
相关产品推荐

