2010-08-27 5 views
4

J'ai une série de paramètres qui sont passés via jQuery Ajax à une action MVC JsonResult. Pour la plupart, ceux-ci arrivent avec succès, mais il y a une valeur de Date qui n'arrive pas du tout. Quelles considérations/formats dois-je utiliser - ou quelles approches dois-je prendre - pour que cette date arrive avec succès?JSON Le paramètre de date transmis à MVC Action est toujours NULL

...other code ... 
myStory.Deadline = new Date($('#story-deadline').val()); 

$.ajax({ 
    url: '/Project/' + action[2] + '/AddStory', 
    data: { Summary: myStory.Summary, Size: myStory.Size, Priority: myStory.Priority, 
      Owner: myStory.Owner, Deadline: myStory.Deadline }, 
    dataType: 'json', 
    traditional: true, 
    type: 'POST', 
...the rest of the code... 

L'action JsonResult:

[HttpPost] 
public JsonResult AddStory(int projectid, Story story) 
{ 
...some code that doesn't have a DateTime object to work with... 

Répondre

5

Microsoft utilise JavaScriptSerializer pour sérialiser/desirealize les données ASP.NET MVC. Si utiliser le format /Date(utcDate)/ pour le type de données Date. Essayez d'utiliser

'"\\/Date(' + myStory.Deadline.getTime() + ')\\/"' 

ou

var d = myStory.Deadline; 
var dateForMS = '"\\/Date(' + 
     Date.UTC (d.getUTCFullYear(), d.getUTCMonth(), 
        d.getUTCDate(), d.getUTCHours(), 
        d.getUTCMinutes(), d.getUTCSeconds(), 
        d.getUTCMilliseconds()) + ')\\/"' 

Vous pouvez aussi utiliser Sys.Serialization.JavaScriptSerializer de MicrosoftAjax.js sérialiser Deadline ou tout autre type Date.

MISE À JOUR: vous devriez probablement utiliser '\/Date(' et ')\/' au lieu de '"\\/Date(' et ')\\/"'. Tout dépend de l'endroit où vous allez insérer la chaîne.

MISE À JOUR 2: Maintenant, je l'ai! ASP.NET MVC est principalement utilisé pour les champs Formulaire de publication par Ajax. Sur le côté serveur sera juste utilisé Parse méthode pour chaque type de convertir le paramètre affiché au type. Donc, on peut utiliser n'importe quel format de chaîne qui sont supportés par DateTime.Parse. Par exemple, vous pouvez utiliser le format ISO 8601 comme '2010-08-29T13: 15: 00.0000000Z'. Pour faire cela dans les navigateurs modernes (firefox, chrome) on peut utiliser la fonction toISOString(). Pour être plus independend on peut mettre en œuvre la conversion de données comme décrit dans http://williamsportwebdeveloper.com/cgi/wp/?p=503:

var d = new Date($('#story-deadline').val()) 
//var d = new Date(); // get the date. Here we use just Now. 
var dAsISOString; 
if ($.isFunction(d.toISOString)) { 
    //alert("internal toISOString are used!"); 
    dAsISOString = d.toISOString(); 
} 
else { 
    dAsISOString = d.getUTCFullYear() + '-' + padzero(d.getUTCMonth() + 1) + '-' + 
        padzero(d.getUTCDate()) + 'T' + padzero(d.getUTCHours()) + ':' + 
        padzero(d.getUTCMinutes()) + ':' + padzero(d.getUTCSeconds())+'.'+ 
        pad2zeros(d.getUTCMilliseconds()) + 'Z'; 
} 
var myStory = { Summary: 'Test description', Size: 8, Dedline: dAsISOString }; 
$.ajax({ 
    url: '/Project/1/AddStory', 
    data: { Summary: myStory.Summary, Size: myStory.Size, Dedline: myStory.Dedline }, 
    dataType: 'json', 
    // ... 
}); 
+0

J'ai essayé à la fois votre suggestion de mise en forme originale et la mise à jour un et les deux sont toujours aussi nuls arrivent. Ils sont affichés correctement, cependant: Date limite \t "/ Date (1283169600000) /" –

+0

Il semble que l'on devrait tester le problème avec le code source de MVC (voir http://weblogs.asp.net/jacqueseloff/archive/2010 /04/20/mvc-2-source-code-released-to-microsoft-reference-server.aspx et http://aspnet.codeplex.com/releases/view/41742). Si vous avez des résultats, faites le moi savoir. – Oleg

+0

cela fonctionne pour moi seulement au cas où je sérialiser manuellement les données en tant que json. ** data: JSON.stringify (params), ** – vsapiha

Questions connexes