2010-10-14 24 views
20

Estoy usando un calendario jQuery para mostrar eventos, que está diseñado para extraer datos del servidor. En innit el calendario dispara una solicitud de AJAX para obtener una matriz de objetos de eventos (codificada json). Todo bien hasta ahora. Sin embargo, esta solicitud incluye una fecha y hora codificadas de JSON (en mi versión, la implementación sí lo hace). El código es el siguiente:ASP.NET MVC - Pasando JSON DateTime al controlador no mapeando a los parámetros del controlador

data: function (start, end, callback) { 
     $.post('/planner/GetPlannerEvents', { test: "test", start: JSON.stringify(start), end: JSON.stringify(end) }, function (result) { callback(result); }); 
    } 

La declaración para el método de controlador de GetPlannerEvents se ve así:

public ActionResult GetPlannerEvents(DateTime start, DateTime end) 

El problema es que asp.net mvc 2 parece que no puede analizar automáticamente la fecha y hora JSON codificado y como tal se queja de que los valores de inicio y final son nulos.

¿Hay algún otro método que deba usarse para pasar las fechas de javascript al servidor para que puedan analizarse correctamente?

Gracias,

+0

¿Hay alguna razón por la que esté utilizando JSON.stringify? ¿Cuáles son los valores anteriores a esa llamada? – Jab

+0

fechas regulares del javascript. Creo que la demo que estaba viendo usó JSON.stringify, pero realmente supongo que no hay una razón real para usarla. – Sergio

Respuesta

48

Usted no debe ser JSON que codifica las fechas con stringify porque la carpeta de modelo predeterminada no espera JSON. Pruebe esto:

$.post('/planner/GetPlannerEvents', { start: start.toUTCString(), 
    end: end.toUTCString() }, function (result) { 
    callback(result); 
}); 
+1

De nuevo, Darin, ¡me alegrarás el día! – Samuel

+1

Puede valer la pena señalar que el controlador espera un parámetro de cadena y no un DateTime. –

+0

Ojalá esta respuesta tuviera más votos. Es un poco difícil cavar en la pila de fechas de paso a las preguntas del controlador MVC. No puedo creer que toUTCString() fuera la respuesta. ¡Accesorios! – tranceporter

-5

Es necesario utilizar el tipo de retorno como 1JsonResult1s en lugar de 1ActionResult1s

su código pasa algo como esto

public JasonResult(DateTime start, DateTime end) { 
    //some logic 
    return Json(); // you can pass any values within Json() with new keyword 
} 
+2

gracias, pero un resultado json es un resultado de acción – Sergio

7

Intente utilizar date.toISOString() para pasar datos al servidor. Devuelve una cadena en formato ISO8601. También este método se puede usar para formatear fechas para usar en uri.

$.post('/planner/GetPlannerEvents', { start: start.toISOString(), 
    end: end.toISOString() }, function (result) { 
    callback(result); 
}); 

¿Por qué es mejor que toISOStringtoUTCString?
toUTCString se convierte en cadena legible para el ser humano en la zona horaria UTC.
toISOString convierte a formato ISO universal que permite resolver el problema con la configuración regional y diferentes formatos.

+0

Totalmente de acuerdo en que ISO es mucho más confiable y consistente que UTC en diferentes máquinas con diferentes configuraciones de localización. – MazBros

0

Las variaciones de date.toString no funcionaron para mí hasta que agregué los encabezados json a la publicación. El código resultante es el siguiente:

var pstData = { 
    begDate: date1.toUTCString(), 
    endDate : date2.toUTCString() 
}; 

$.ajax({ 
    url:'url', 
    type:'POST', 
    data: JSON.stringify(pstData), 
    contentType: "application/json; charset=utf-8", 
    dataType: "json", 
}) 
Cuestiones relacionadas