2012-02-23 12 views
10

Cuando publico un objeto json con una propiedad de fecha en un ApiController no se deserializará en una fecha.Publicación de DateTime en un ApiController en ASP MVC 4 (Beta)

código del sitio

Servidor:

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; } 
} 

Entonces hago una petición POST con el violinista

POSTAL http://localhost:62990/MegaTest HTTP/1.1

User-Agent: El violinista

host: localhost : 62990

Content-Type: text/JSON

Content-Length: 54

{ "fecha": "/ Fecha (1239018869048) /", "Nombre": "Amigo" }

Pero el objeto que entra sólo tiene el conjunto Name propiedad, la propiedad es Date {01.01.0001 00:00:00}

estoy pasando por alto cualquier encabezado o configuración del proyecto?


Editar: Las solicitudes son en realidad proviene de una HttpClient. ¿Es posible formatear la fecha antes de enviar la solicitud con 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); 

Editar: Este es un problema conocido con el ASP MVC 4 Beta y la versión final del ASP MVC 4 utilizará Json.net como un serializador JSON hasta entonces se puede usar el serializador XML por defecto o cambie el serializador Json predeterminado para Json.net. Más información se puede encontrar en hanselman blog

+0

http://stackoverflow.com/questions/206384/how-to-format-a-json-date – tugberk

Respuesta

4

Este es un error conocido con el ASP MVC 4 Beta y la versión final de ASP MVC 4 utilizará Json.net como un serializador json hasta entonces puede usar el serializador XML predeterminado o cambiar el serializador Json predeterminado para Json.net. Más información se puede encontrar en hanselman blog

Aquí está un pequeño ejemplo del uso del XML predeterminado Serializador para enviar DateTime con HttpClient:

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); 

Pero si se quisiera utilizar JSON entonces aquí es una buena entrada en el blog en using JSON.NET with ASP.NET Web API

16

Intente publicar su fecha/hora como "aaaa-MM-dd HH: mm: ss". ASP MVC lo manejará correctamente.

+2

¿No depende de la cultura actual del servidor? –

8

Parece que la API web no acepta las fechas en el antiguo formato AJAX de ASP.NET para los datos POST codificados en la URL. Parece que hay dos formatos que acepta fechas codificados de URL en la actualidad:

ShortDateString: "2/23/2012"

ISO: "2012-02-23T00: 00: 00"

El más adelante está el formato ISO DateTime, y hay una variedad de fragmentos de código que puede encontrar para ayudarlo a convertir un objeto JavaScript Date en ese formato. Varios mencionaron aquí: How do I output an ISO 8601 formatted string in JavaScript?

Web API no todavía aceptar el/Date()/formato si envía los datos como JSON y establecer el tipo de contenido correctamente sin embargo:

$.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" }' 
}); 
1

ASP.Net Web API utiliza el DataContractJsonSerializer que tiene errores que rodean la serialización de DateTime. En su lugar, debe usar JSON.Net e implementar un MediaTypeFormatter que use JSON.Net en lugar de DataContractJsonSerializer. Mira mi respuesta para una pregunta similar here.

Cuestiones relacionadas