2010-08-27 17 views
7

Aquí está mi código jQuery:Pasar un día con JSON a .NET

function onSaveClicked() 
{ 
    var message = 
    { 
     MessageID: $("#MessageID").val() || 0, 
     MessageDate: "\/Date(<%= DateTime.Now.Ticks %>)\/", 
    }; 


    $.ajax({ 
     url: "<%= Url.Action("SaveMessage") %>", 
     type: "POST", 
     dataType: "json", 
     data: $.toJSON(message), 
     contentType: "application/json; charset=utf-8", 
     success: function(result) { 
      if (result && result.success) 
      { 
       // 
      } 
     } 
    }); 
} 

Al principio, yo estaba poniendo MessageDate a una cadena que estaba en un formato de fecha, pero después de algunos errores allí, lo hice algunas investigaciones y parece que necesito pasar las Garrapatas. Pero me sale el siguiente error:

Hubo un error al deserializar el objeto del tipo Models.MessageModel. El valor '634185025866884281' no se puede analizar como el tipo 'DateTime'

También he intentado:

MessageDate: "\\/Date(<%= DateTime.Now.Ticks %>)\\/", 

pero me da este mensaje de error:

Hubo un error al deserializar el objeto de tipo Models.MessageModel. El contenido de DateTime '/ Date (634185027273624742) /' no comienza con '/ Date (' y termina con ') /' según se requiera para JSON.

¿Qué debo hacer para que funcione?

EDIT: estoy usando este deserializar la solicitud JSON:

public override void OnActionExecuting(ActionExecutingContext filterContext) 
{ 
    if (filterContext.HttpContext.Request.ContentType.Contains("application/json")) 
    { 
     var serializer = new DataContractJsonSerializer(RootType); 
     //RootType here is (Name = "MessageModel", FullName="Models.MessageModel") 

     filterContext.ActionParameters["message"] = serializer.ReadObject(filterContext.HttpContext.Request.InputStream); 


    } 
} 
+0

¿Qué acción usa 'SaveMessage' para deserializar la solicitud JSON? –

+0

Edité mi original, se muestra arriba ahora. – Steven

Respuesta

2

Usted puede tratar de la siguiente función:

public static string FormatDate(DateTime dt) 
{ 
    var serializer = new DataContractJsonSerializer(typeof(DateTime)); 
    using (var stream = new MemoryStream()) 
    { 
     serializer.WriteObject(stream, dt); 
     return Encoding.Default.GetString(stream.ToArray()); 
    } 
} 

Y en su opinión:

var message = 
{ 
    MessageID: $("#MessageID").val() || 0, 
    MessageDate: "/Date(<%= SomeClass.FormatDate(DateTime.Now) %>)/" 
}; 
+1

Esto me dio el siguiente error: Hubo un error al deserializar el objeto del tipo Models.MessageModel. El valor '/ Fecha (1282924488721' no se puede analizar como el tipo 'Int64' – Steven

+0

¿Podría publicar la cadena JSON que se pasa en su ActionFilter? En su ejemplo, el contenido de 'filterContext.HttpContext.Request.InputStream'. –

+0

Leo la corriente en un conjunto de bytes, y luego se convierte la matriz de bytes en una cadena Este es el resultado: "1233477101115115971031017368345848443484105116108101345834116101115116503444346810111599114105112116105111110345834116101115116105110103344434689711610183116971141163458344768971161014047689711610140495056505750565150515654504548524848414741473444346897116101691101003458344768971161014047689711610140495056505750565150515654514548524848414741473444348610511510598108101345810297108115101125" – Steven

1

que tenía el mismo problema. Lo que hice fue usar la siguiente función para convertirlo en un número

private double GetUnixEpoch(DateTime dateTime) 
    { 
     var unixTime = dateTime.ToUniversalTime() - 
      new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc); 

     return unixTime.TotalMilliseconds; 
    } 

continuación, puede utilizar ese número en el constructor del objeto Date de JavaScript para crear el objeto de fecha.

+1

¿Puede mostrarme un ejemplo de cómo usaría eso en mi Javascript? – Steven

0

This post da esta solución (modificado) que se había puesto en el cliente con JSON.stringify ():

jsonData = JSON.stringify([new Date()], 
    function (k, v) { return this[k] instanceof Date ? '/Date(' + v + ')/' : v; }); 

que trabaja en el último IE, Chrome y Firefox para mí.