在 ASP MVC 4 (Beta) 中将 DateTime 发布到 ApiController

Posted

技术标签:

【中文标题】在 ASP MVC 4 (Beta) 中将 DateTime 发布到 ApiController【英文标题】:Posting DateTime to a ApiController in ASP MVC 4 (Beta) 【发布时间】:2012-02-23 16:31:28 【问题描述】:

当我将带有日期属性的 json 对象发布到 ApiController 时,它不会反序列化为日期。

服务器站点代码:

public class MegaTestController : ApiController

    // POST /megatest
    public void Post(ttt value)
    
        string sdf = "!sad";
    


public class ttt

    public DateTime Date  get; set; 
    public string Name  get; set; 

然后我用 fiddler 做一个 POST 请求

POST http://localhost:62990/MegaTestHTTP/1.1

用户代理:提琴手

主机:本地主机:62990

内容类型:文本/json

内容长度:54

"日期":"/日期(1239018869048)/", “名字”:“伙计”

但是进来的对象只有Name属性集,Date属性是01.01.0001 00:00:00

我是否缺少任何标题或项目设置?


编辑:请求实际上来自HttpClient。是否可以在使用HttpClient 发送请求之前格式化日期?

public Task<T> Create<T>(T item)

    var service = new HttpClient();
    service.BaseAddress = new Uri("http://localhost:62990");

    var method = typeof(T).Name + "s"; // in this case it will be ttts

    var req = new HttpRequestMessage<T>(item);
    req.Content.Headers.ContentType = new MediaTypeHeaderValue("text/json");

    return service.PostAsync(method, req.Content).ContinueWith((reslutTask) =>
    
        return reslutTask.Result.Content.ReadAsAsync<T>();
    ).Unwrap();


var data = new ttt  Name = "Dude", Date = DateTime.Now ;
Create(data);

编辑:这是 ASP MVC 4 Beta 的一个已知错误,并且 ASP MVC 4 的最终版本将使用 Json.net 作为 json 序列化程序,直到那时您可以使用默认的 XML 序列化程序或为 Json.net 切换默认的 Json 序列化程序。更多信息请访问hanselman blog

【问题讨论】:

***.com/questions/206384/how-to-format-a-json-date 【参考方案1】:

尝试将您的日期/时间发布为“yyyy-MM-dd HH:mm:ss”。 ASP MVC 会正确处理。

【讨论】:

不是取决于当前的服务器文化吗?【参考方案2】:

对于 URL 编码的 POST 数据,Web API 似乎不接受旧 ASP.NET AJAX 格式的日期。目前似乎有两种格式可以接受 URL 编码的日期:

ShortDateString:“2012 年 2 月 23 日”

ISO:“2012-02-23T00:00:00”

后者是 ISO DateTime 格式,您可以找到各种代码 sn-ps 来帮助将 javascript Date 对象转换为该格式。这里提到了几个:How do I output an ISO 8601 formatted string in JavaScript?

如果您以 JSON 格式发送该数据并正确设置 Content-Type,则 Web API 确实仍然接受 /Date()/ 格式:

$.ajax(
  url: 'MegaTest',
  type: 'POST',
  // Setting this Content-Type and sending the data as a JSON string
  //  is what makes the old /Date()/ format work.
  contentType: 'application/json',
  data: ' "Date":"/Date(1239018869048)/", "Name":"Dude" '
);

【讨论】:

【参考方案3】:

这是 ASP MVC 4 Beta 的一个已知错误,并且 ASP MVC 4 的最终版本将使用 Json.net 作为 json 序列化程序,直到那时您可以使用默认 XML 序列化程序或为 @987654322 切换默认 Json 序列化程序@。更多信息请访问hanselman blog

这是一个使用默认 XML 序列化器通过 HttpClient 发送DateTime 的小示例:

var service = new HttpClient();
service.BaseAddress = url;

var mediaType = new MediaTypeHeaderValue("application/xml");
XmlMediaTypeFormatter formater = new XmlMediaTypeFormatter();
var req = new HttpRequestMessage<T>(item, mediaType, new MediaTypeFormatter[]  formater );

service.PutAsync(method, req.Content);

但是,如果您想使用 json,那么这里有一篇关于 using JSON.NET with ASP.NET Web API 的好博文

【讨论】:

【参考方案4】:

ASP.Net Web API 使用DataContractJsonSerializer,它存在与DateTime 序列化相关的错误。您应该改用 JSON.Net,并实现一个使用 JSON.Net 而不是 DataContractJsonSerializer 的MediaTypeFormatter。查看我对类似问题的回答here。

【讨论】:

以上是关于在 ASP MVC 4 (Beta) 中将 DateTime 发布到 ApiController的主要内容,如果未能解决你的问题,请参考以下文章

在 ASP.NET Core 中将 Razor 视图渲染为字符串

无法在 asp.net mvc 4 中将 JSON 对象映射到 JqGrid

ASP.NET MVC - 加载 Maxmind dat 文件

在 ASP.net MVC 4 中将类对象从一个控制器动作传递到不同的控制器动作

在 MVC Web Api 4 Beta 中从 Json 中删除 Null 属性

如何在 Asp.Net MVC4 Razpr 视图中将操作链接作为图像?