2010-10-14 5 views
20

J'utilise un calendrier jQuery pour afficher les événements, qui est conçu pour extraire des données du serveur. Lors de l'initialisation, le calendrier déclenche une requête AJAX pour obtenir un tableau d'objets d'événements (codé json). Tout va bien jusqu'ici. Cependant, cette requête inclut une date et une heure codées en JSON (au niveau de mon implémentation). Le code ressemble à ceci:ASP.NET MVC - Passage de JSON DateTime au contrôleur non mappé aux paramètres du contrôleur

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

La déclaration de la méthode du contrôleur de GetPlannerEvents ressemble à ceci:

public ActionResult GetPlannerEvents(DateTime start, DateTime end) 

Le problème est que asp.net mvc 2 ne peut pas sembler analyser automatiquement le datetime codé JSON et en tant que tel se plaint que les valeurs de début et de fin sont nulles.

Existe-t-il une autre méthode que je devrais utiliser pour transmettre les dates javascript au serveur afin qu'elles puissent être correctement analysées?

Merci,

+0

Y at-il une raison pour laquelle vous utilisez JSON.stringify? Quelles sont les valeurs avant cet appel? – Jab

+0

dates javascript régulières. Je pense que la démo que je regardais utilisait JSON.stringify, mais je suppose qu'il n'y a pas vraiment de raison de l'utiliser. – Sergio

Répondre

48

Vous ne devriez pas être JSON coder les dates avec stringify parce que le classeur de modèle par défaut n'attend pas JSON. Essayez ceci:

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

Encore une fois Darin, tu fais ma journée! – Samuel

+1

Peut être utile de noter que le contrôleur attend un paramètre de chaîne et non un DateTime. –

+0

Je souhaite que cette réponse ait plus de voix. Un peu difficile à creuser dans la pile de la date de passage aux questions du contrôleur MVC. Ne peut pas croire toUTCString() était la réponse. Props! – tranceporter

-5

Vous devez utiliser le type de retour comme 1JsonResult1s au lieu de 1ActionResult1s

votre code va somthing comme ce

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

merci, mais un résultat json est un actionelult – Sergio

7

Essayez d'utiliser date.toISOString() pour transmettre des données au serveur. Il renvoie la chaîne au format ISO8601. Cette méthode peut également être utilisée pour formater les dates d'utilisation de l'uri.

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

Pourquoi toISOString est mieux que toUTCString?
toUTCString convertit en chaîne lisible par l'utilisateur dans le fuseau horaire UTC.
toISOString convertit en format ISO universel qui permet de résoudre le problème avec les paramètres régionaux et différents formats.

+0

Tout à fait d'accord que ISO est beaucoup plus fiable et cohérente que UTC sur différentes machines avec différents paramètres de localisation. – MazBros

0

Les variations de date.toString ne fonctionnaient pas pour moi jusqu'à ce que j'ai ajouté des en-têtes json à la poste. Le code qui en résulte est le suivant:

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", 
}) 
Questions connexes