Angular+MVC项目服务器端JSON日期字符串反序列化与转换问题
解决Angular与MVC混合项目中日期字符串转DateTime的问题
嘿,我来帮你搞定这个头疼的日期转换问题!咱们一步步拆解:
问题根源:多余的双引号
你用JSON.stringify把日期字符串传给服务器,导致后端收到的是带双引号的字符串(比如\"05/10/2018\"),这直接导致DateTime.Parse失败——因为它没法识别带引号的日期格式。
方案1:从源头解决(推荐)
客户端根本不需要用JSON.stringify来传递日期字符串!直接传原始的日期字符串就行,这样后端收到的就是干净的05/10/2018:
修改客户端服务类代码:
private GetLOBUrl = 'http://localhost:63213/Vto/GetLOB'; getLOBs(action: string = null, data?: VTO): Observable<VTO[]> { // 去掉JSON.stringify,直接传action(日期字符串) return this.http.post<VTO[]>(this.GetLOBUrl + `/?ReportDate=${action}`,null) .catch(this.errorHandler); } errorHandler(error: HttpErrorResponse) { return Observable.throw(error.message || "Server Error"); }
方案2:后端处理带引号的字符串(如果必须保留JSON.stringify)
如果因为业务场景限制,客户端必须用JSON.stringify,那后端第一步要先剥离前后的双引号,再做日期转换:
public static IEnumerable<DTO.DropDownItem> SelectLOB(string reportDate) { // 第一步:去掉前后的双引号 reportDate = reportDate.Trim('"'); // 第二步:安全转换日期(推荐用ParseExact避免格式歧义) // 注意:这里要明确你的日期格式是MM/dd/yyyy还是dd/MM/yyyy,别搞混! DateTime rDate; if (!DateTime.TryParseExact(reportDate, "MM/dd/yyyy", CultureInfo.InvariantCulture, DateTimeStyles.None, out rDate)) { // 转换失败时的处理逻辑,比如抛异常或返回空列表 throw new ArgumentException("日期格式错误,请传入MM/dd/yyyy格式的字符串"); } string query = @"SELECT Id, Description FROM TABLE WHERE StartDate = @reportDate AND StopDate is NULL"; IEnumerable<DTO.DropDownItem> items = new List<DTO.DropDownItem>(0); var p = new DynamicParameters(); // 注意:这里要传转换后的DateTime类型rDate,不是原始字符串! p.Add("@reportDate", rDate); using (SqlConnection con = Connection.GetConnection()) { items = con.Query<DTO.DropDownItem>(query, param: p, commandType: CommandType.Text); } return items; }
关于NuGet包的疑问
你当前用的DynamicParameters和Query方法应该来自Dapper,既然代码能正常编译运行,说明你已经安装了Dapper的NuGet包,不需要额外安装其他包来处理日期转换。
内容的提问来源于stack exchange,提问作者SilverFish
相关产品推荐
相关产品推荐

