2010-10-14 29 views
20

Sto utilizzando un calendario jQuery per visualizzare gli eventi, che è stato progettato per estrarre i dati dal server. In realtà il calendario attiva una richiesta AJAX per ottenere una serie di oggetti eventi (json codificati). Tutto bene finora. Tuttavia, questa richiesta include una data e l'ora codificate JSON (a metà della mia implusione). Il codice è simile al seguente:ASP.NET MVC: passaggio del DateTime JSON al controller che non esegue il mapping ai parametri del controller

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

La dichiarazione per il metodo di controllo GetPlannerEvents assomiglia a questo:

public ActionResult GetPlannerEvents(DateTime start, DateTime end) 

Il problema è che asp.net MVC 2 non riesco a analizzare automaticamente il JSON codificato datetime e come tale si lamenta che i valori di inizio e fine sono nulli.

C'è un altro metodo che dovrei usare per passare le date javascript al server in modo che possano essere analizzate correttamente?

Grazie,

+0

C'è qualche ragione per cui si sta utilizzando JSON.stringify? Quali sono i valori precedenti a quella chiamata? – Jab

+0

date javascript regolari. Penso che la demo che stavo cercando usasse JSON.stringify, ma in realtà suppongo che non ci sia un vero motivo per usarla. – Sergio

risposta

48

Non si dovrebbe essere JSON codifica le date con stringify perché il modello di associazione predefinito non prevede JSON. Prova questo:

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

Ancora una volta, Darin, tu fai la mia giornata! – Samuel

+1

Può valere la pena notare che il controller si aspetta un parametro stringa e non un DateTime. –

+0

Vorrei che questa risposta avesse più voti. È difficile scavare nella pila della data che passa alle domande del controller MVC. Non posso credere aUTCString() era la risposta. Puntelli! – tranceporter

-5

È necessario utilizzare tipo di ritorno come 1JsonResult1s invece di 1ActionResult1s

il codice va somthing come questo

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

grazie, ma un risultato json è un actionresult – Sergio

7

Prova a utilizzare date.toISOString() per passare i dati al server. Restituisce la stringa nel formato ISO8601. Anche questo metodo può essere utilizzato per formattare le date per l'utilizzo in uri.

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

Perché toISOString è meglio di toUTCString?
toUTCString convertito in stringa leggibile dall'uomo nel fuso orario UTC.
toISOString converte in formato ISO universale che consente di risolvere il problema con impostazioni internazionali e formati diversi.

+0

Totalmente d'accordo sul fatto che ISO è molto più affidabile e coerente di UTC su macchine diverse con impostazioni di localizzazione diverse. – MazBros

0

Le varianti di date.toString non hanno funzionato per me fino a quando non ho aggiunto intestazioni json al post. Il codice risultante è il seguente:

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", 
}) 
Problemi correlati