एएसपीएनटी एमवीसी 3 - पर्मेटेड कंट्रोलर विधि में पोस्ट पेलोड पढ़ना

मैंने लिया

[HttpPost]        
public ActionResult Foo()
{
   //read HTTP payload
    var reqMemStream = new MemoryStream(HttpContext.Request.BinaryRead(HttpContext.Request.ContentLength));
 ....
}

पेलोड एप्लिकेशन/जेसन है; ठीक काम किया; तो मैं बदल गया

public ActionResult Foo(string thing)
{
....
}

MyController/Foo? Thing = yo पर पोस्ट करने का इरादा है अब मैं पेलोड पढ़ नहीं सकता (लंबाई सही है लेकिन धारा खाली है)। मेरा अनुमान है कि नियंत्रक नलसाजी ने फॉर्म पोस्ट डेटा की तलाश में पेलोड खा लिया है जिसे विधि पैरामीटर में मैप किया जा सकता है। क्या कोई तरीका है कि मैं इस व्यवहार को रोक सकता हूं (निश्चित रूप से एमवीसी को एक पेलोड नहीं खाना चाहिए था जिसका प्रकार JSON के रूप में चिह्नित किया गया है, इसे केवल फॉर्म पोस्ट डेटा देखना चाहिए)। मेरे काम के आसपास जेसन में 'चीज़' जोड़ना है, लेकिन मुझे वास्तव में ऐसा नहीं लगता है

0
जोड़ा संपादित
विचारों: 1

1 उत्तर

पढ़ने से पहले इनपुट स्ट्रीम स्थिति को रीसेट करने का प्रयास करें:

public ActionResult Foo(string thing)
{
    Request.InputStream.Position = 0;
    var reqMemStream = new MemoryStream(HttpContext.Request.BinaryRead(HttpContext.Request.ContentLength));
    ....
}

अब यह कहा जा रहा है, यदि आप एक एप्लिकेशन/जेसन पेलोड भेज रहे हैं तो पवित्र पृथ्वी पर आप केवल दृश्य स्ट्रीम को परिभाषित करने और उपयोग करने के बजाय अनुरोध स्ट्रीम को पढ़ने के लिए परेशान हैं:

public class MyViewModel
{
    public string Thing { get; set; }
    public string Foo { get; set; }
    public string Bar { get; set; }
    ...
}

और फिर:

public ActionResult Foo(MyViewModel model)
{
   //use the model here 
    ....
}

एएसपी.नेट एमवीसी 3 में एक अंतर्निहित JsonValueProviderFactory है जो आपको मॉडलों के लिए JSON अनुरोधों को स्वचालित रूप से बाध्य करने की अनुमति देता है। और यदि आप पुराने संस्करण का उपयोग कर रहे हैं तो इस तरह के कारखाने को अपने आप को जोड़ने में आसानी से आसान है क्योंकि फिल हैक उसका ब्लॉग पोस्ट

0
जोड़ा
अपने "पृथ्वी पर क्यों, ..." के संबंध में, मेरे मामले में कोई विचार या मॉडल नहीं हैं। मेरी कॉल सभी शुद्ध AJAX कॉल हैं। मैं बस 'आरईएसटी' सर्वर पक्ष के लिए एक अच्छा ढांचा के रूप में एमवीसी के सी भाग का उपयोग कर रहा हूं। इसके अलावा माइक्रोसॉफ्ट जेसन समर्थन जटिल प्रकारों के लिए अच्छा नहीं है, मैं इसके बजाय json.net का उपयोग करता हूं
जोड़ा लेखक pm100, स्रोत
Request.InputStream.Position = 0; एक वैध जवाब है।
जोड़ा लेखक Max Favilli, स्रोत