2011-05-13 2 views
1

J'utilise JQUERY ajax pour appeler une méthode MVC:Date JSON obtenir la mauvaise date

JQUERY:

$.ajax({ 
      type: "POST", 
      contentType: "application/json; charset=utf-8", 
      url: "/Home/GetApplication/" + id, 
      dataType: "json", 
      data: '', 
      timeout: 10000, 
      success: function (obj) { 

       $('#Name').val(obj.Name); 
       $('#ApplicationIdentifier').val(obj.ApplicationIdentifier); 
       $('#Frequency').val(obj.FrequencyValue); 
       var d = new Date(parseInt(obj.BaseDate.substr(6))); 
       $('#BaseDate').val(d.getMonth() + '/' + d.getDay() + '/' + d.getFullYear()); 

      }, 
      error: function() { 
       return; 
      } 
     }); 

MVC Méthode:

[HttpPost] 
     public ActionResult GetApplication(int id) 
     { 
      return Json(new Application 
          { 
           Name = "Testing", 
           ApplicationIdentifier = "123ABC", 
           FrequencyValue = 1, 
           FrequencyType = 1, 
           BaseDate = DateTime.Now 
          }); 
     } 

Tout cela fonctionne très bien, sauf la La date figurant sur mon formulaire est le 4/5/2011 et devrait être le 13/05/2011. Est-ce que j'ai râté quelque chose? Merci.

+0

Peut-être en spécifiant cultureInfo. – jerone

+0

Oui mais pour plus d'un mois? – Cyberdrew

+1

Quelle est la valeur dans le retour JSON pour 'obj.BaseDate'? –

Répondre

1

de travail avec les dates et heures entre JavaScript et .NET peut être difficile, et nous traitons habituellement cela dans nos applications en faisant toujours l'interaction sous Unix Time:

[HttpPost] 
public ActionResult GetApplication(int id) 
{ 
    DateTime unixTime = new DateTime(1970, 1, 1, 0, 0, 0, 0); 

    return Json(new Application 
     { 
      Name = "Testing", 
      ApplicationIdentifier = "123ABC", 
      FrequencyValue = 1, 
      FrequencyType = 1, 
      BaseDate = (DateTime.Now - unixTime).TotalMilliseconds 
     }); 
} 

Maintenant que votre application JavaScript a Unix le temps, il peut facilement être converti en une date (vous aussi le formatage de votre chaîne de date incorrectement):

$.ajax({ 
    type: "POST", 
    contentType: "application/json; charset=utf-8", 
    url: "/Home/GetApplication/" + id, 
    dataType: "json", 
    data: '', 
    timeout: 10000, 
    success: function (obj) { 
     var d = new Date(obj.BaseDate); 
     var dateString = (d.getMonth() + 1) + '/' + d.getDate() + '/' + d.getFullYear(); 

     $('#Name').val(obj.Name); 
     $('#ApplicationIdentifier').val(obj.ApplicationIdentifier); 
     $('#Frequency').val(obj.FrequencyValue); 
     $('#BaseDate').val(dateString); 
    }, 
    error: function() { 
     return; 
    } 
}); 

de plus, je ne voudrais pas retourner votre entité EF à l'extrémité avant, ne lui donne ce qu'il vraiment Besoins. En utilisant un objet dynamic, vos types peuvent être inférées ici, et devient datedebase quel type vous lui donnez:

[HttpPost] 
public ActionResult GetApplication(int id) 
{ 
    DateTime unixTime = new DateTime(1970, 1, 1, 0, 0, 0, 0); 

    return Json(new { 
      Name = "Testing", 
      ApplicationIdentifier = "123ABC", 
      FrequencyValue = 1, 
      BaseDate = (DateTime.Now - unixTime).TotalMilliseconds 
     }); 
} 
+0

BaseDate est une colonne DateTime de EF. Je reçois l'erreur ne peut pas convertir en double à DateTime. – Cyberdrew

+0

Vous ne devez pas renvoyer ce champ à l'extrémité avant. Ne donnez au front ce dont il a besoin. – Eli

+0

Cela a très bien fonctionné, j'ai simplement ignoré toute la date unix et j'ai fait DateTime.Now.ToString ("M/j/aaaa") Je ne m'inquiète pas d'être une date dans mon formulaire tant qu'elle est correctement formatée. Je vous remercie. – Cyberdrew

0

La façon dont je tourne un \/Date(1234567889)\/ en une date que javascript peut utiliser est la suivante: obj.BaseDate.slice(6, obj.BaseDate.length - 2);

sérialisation date de Microsoft provoque la chaîne, de sorte que vous devez dépouiller tout autre que le numéro.

Cette ligne entière deviendrait var d = new Date(parseInt(obj.BaseDate.slice(6, obj.BaseDate.length - 2)));

+0

Je reçois DateTime n'est pas défini – Cyberdrew

+0

C'est ce que je reçois pour copier/coller de mon propre code. J'ai corrigé les exemples de code. – thedaian

1

getMonth() retourne une valeur comprise entre 0 et 11, donc il suffit d'ajouter 1 à ce (source).

1

retourne getMonth() 0-11; getDay() obtient le jour de la semaine!