2012-02-23 21 views
10

में एक एपीकंट्रोलर को डेटटाइम पोस्ट करना जब मैं एक एपीकंट्रोलर को दिनांक संपत्ति के साथ एक जेसन ऑब्जेक्ट पोस्ट करता हूं तो यह किसी तारीख में deserialize नहीं होगा।एएसपी एमवीसी 4 (बीटा)

सर्वर साइट कोड:

public class MegaTestController : ApiController 
{ 
    // POST /megatest 
    public void Post(ttt value) 
    { 
     string sdf = "!sad"; 
    } 
} 

public class ttt 
{ 
    public DateTime Date { get; set; } 
    public string Name { get; set; } 
} 

तब मैं Fiddler

POST के साथ कोई पोस्ट अनुरोध कर http://localhost:62990/MegaTest HTTP/1.1

उपयोगकर्ता-एजेंट: Fiddler

मेजबान: स्थानीय होस्ट : 629 9 0

सामग्री प्रकार: पाठ/json

सामग्री-लंबाई: 54

{ "दिनांक": "/ तारीख (1239018869048) /", "नाम": "Dude" }

लेकिन वस्तु केवल में आ रहा है Name संपत्ति सेट है, Date संपत्ति {01.01.0001 00:00:00}

मैं किसी भी हेडर या परियोजना सेटिंग नहीं कर रहा हूँ है?


संपादित: अनुरोध वास्तव में एक HttpClient से आ रहे हैं। HttpClient के साथ अनुरोध भेजने से पहले तारीख को प्रारूपित करना संभव है?

public Task<T> Create<T>(T item) 
{ 
    var service = new HttpClient(); 
    service.BaseAddress = new Uri("http://localhost:62990"); 

    var method = typeof(T).Name + "s"; // in this case it will be ttts 

    var req = new HttpRequestMessage<T>(item); 
    req.Content.Headers.ContentType = new MediaTypeHeaderValue("text/json"); 

    return service.PostAsync(method, req.Content).ContinueWith((reslutTask) => 
    { 
     return reslutTask.Result.Content.ReadAsAsync<T>(); 
    }).Unwrap(); 
} 

var data = new ttt { Name = "Dude", Date = DateTime.Now }; 
Create(data); 

संपादित: यह एएसपी MVC 4 बीटा और एएसपी MVC 4 के अंतिम संस्करण एक json serializer के रूप में Json.net का उपयोग करेगा तब तक आप डिफ़ॉल्ट एक्सएमएल serializer उपयोग कर सकते हैं के साथ एक ज्ञात बग है Json.net के लिए डिफ़ॉल्ट जेसन सीरिएलाइज़र को स्विच करें। अधिक जानकारी hanselman blog

+0

http://stackoverflow.com/questions/206384/how-to-format-a-json-date – tugberk

उत्तर

4

यह एएसपी MVC 4 बीटा और एएसपी MVC 4 के अंतिम संस्करण जब तक एक json serializer के रूप में Json.net का उपयोग करेगा तो आप डिफ़ॉल्ट एक्सएमएल serializer का उपयोग करें या Json.net के लिए डिफ़ॉल्ट Json serializer बाहर स्विच कर सकते हैं के साथ एक ज्ञात बग है। अधिक जानकारी hanselman blog

पर पाया जा सकता यहाँ डिफ़ॉल्ट एक्सएमएल Serializer का उपयोग कर HttpClient साथ DateTime भेजने के लिए की एक छोटा सा उदाहरण है:

var service = new HttpClient(); 
service.BaseAddress = url; 

var mediaType = new MediaTypeHeaderValue("application/xml"); 
XmlMediaTypeFormatter formater = new XmlMediaTypeFormatter(); 
var req = new HttpRequestMessage<T>(item, mediaType, new MediaTypeFormatter[] { formater }); 

service.PutAsync(method, req.Content); 

लेकिन तुम तो यहाँ json उपयोग करना चाहते हैं, तो एक अच्छा ब्लॉग पोस्ट है using JSON.NET with ASP.NET Web API

16

पर आपकी तिथि/समय को "yyyy-MM-dd hH: mm: ss" के रूप में पोस्ट करने का प्रयास करें। एएसपी एमवीसी इसे ठीक से संभाल लेंगे।

+2

क्या यह वर्तमान सर्वर संस्कृति पर निर्भर नहीं है? –

8

ऐसा प्रतीत होता है कि वेब एपीआई यूआरएल एन्कोडेड पोस्ट डेटा के लिए पुराने एएसपी.NET AJAX प्रारूप में तिथियों को स्वीकार नहीं करता है।

ShortDateString:: वहाँ दो प्रारूपों कि यह वर्तमान में URL इनकोडिंग दिनांकों को स्वीकार करता प्रतीत हो रहा है "2012/02/23"

आईएसओ: "2012-02-23T00: 00: 00"

बाद में आईएसओ डेटटाइम प्रारूप है, और ऐसे कई प्रकार के कोड स्निपेट हैं जिन्हें आप जावास्क्रिप्ट डेट ऑब्जेक्ट को उस प्रारूप में परिवर्तित करने में मदद के लिए पा सकते हैं। कई यहाँ उल्लेख किया: How do I output an ISO 8601 formatted string in JavaScript?

वेब एपीआई अभी भी()/प्रारूप/तिथि को स्वीकार करता है अगर तुम भेज कि और JSON के रूप में डेटा सामग्री प्रकार सही रूप से निर्धारित हालांकि:

$.ajax({ 
    url: 'MegaTest', 
    type: 'POST', 
    // Setting this Content-Type and sending the data as a JSON string 
    // is what makes the old /Date()/ format work. 
    contentType: 'application/json', 
    data: '{ "Date":"/Date(1239018869048)/", "Name":"Dude" }' 
}); 
1

एएसपी।नेट वेब एपीआई DataContractJsonSerializer का उपयोग करता है जिसमें DateTime के क्रमिकरण के आस-पास कीड़े हैं। आपको इसके बजाय JSON.Net का उपयोग करना चाहिए, और MediaTypeFormatter लागू करना चाहिए जो DataContractJsonSerializer के बजाय JSON.Net का उपयोग करता है। एक समान प्रश्न here के लिए मेरा उत्तर देखें।