[C#] पोस्ट json शब्दकोश


Answers

एक दुर्भाग्यपूर्ण समाधान:

data.dictionary = {
    'A': 'a',
    'B': 'b'
};

data.dictionary = JSON.stringify(data.dictionary);

. . .

postJson('/mvcDictionaryTest', data, function(r) {
    debugger;
}, function(a,b,c) {
    debugger;
});

postJSON जेएस लिब फ़ंक्शन (jQuery का उपयोग करता है):

function postJson(url, data, success, error) {
    $.ajax({
        url: url,
        data: JSON.stringify(data),
        type: 'POST',
        contentType: 'application/json; charset=utf-8',
        dataType: 'json',
        success: success,
        error: error
    });
}

देखेंमोडल ऑब्जेक्ट पोस्ट किया जा रहा है (संभवतः एक शब्दकोश से अधिक हो रहा है):

public class TestViewModel
{
    . . .
    //public Dictionary<string, string> dictionary { get; set; }
    public string dictionary { get; set; }
    . . .
}

नियंत्रक विधि को पोस्ट किया जा रहा है:

[HttpPost]
public ActionResult Index(TestViewModel model)
{
    var ser = new System.Web.Script.Serialization.JavascriptSerializer();
    Dictionary<string, string> dictionary = ser.Deserialize<Dictionary<string, string>>(model.dictionary);

    // Do something with the dictionary
}
Question

मैं निम्नलिखित की कोशिश कर रहा हूं: अंदर एक शब्दकोश के साथ एक मॉडल इसे पहले एजेक्स अनुरोध पर भेजें तो परिणाम को फिर से क्रमबद्ध करें और नियंत्रक को वापस भेजें।

यह जांचना चाहिए कि मैं अपने मॉडल में एक शब्दकोश वापस प्राप्त कर सकता हूँ यह काम नहीं करता है

यह मेरा सरल परीक्षण है:

public class HomeController : Controller
{
    public ActionResult Index (T a)
    {
      return View();
    }

    public JsonResult A(T t)
    {
      if (t.Name.IsEmpty())
      {
        t = new T();
        t.Name = "myname";
        t.D = new Dictionary<string, string>();
        t.D.Add("a", "a");
        t.D.Add("b", "b");
        t.D.Add("c", "c");
      }
      return Json(t);
    }
}

//model
public class T
{
  public string Name { get; set; }
  public IDictionary<string,string> D { get; set; }
}

जावास्क्रिप्ट:

$(function () {
    var o = {
        Name: 'somename',
        "D": {
            "a": "b",
            "b": "c",
            "c": "d"
        }
    };

    $.ajax({
        url: actionUrl('/home/a'),
        contentType: 'application/json',
        type: 'POST',
        success: function (result) {
            $.ajax({
                url: actionUrl('/home/a'),
                data: JSON.stringify(result),
                contentType: 'application/json',
                type: 'POST',
                success: function (result) {
                }
            });
        }
    });
});

फायरबग में जेएसएन प्राप्त हुआ और जेसन भेजा गया समान है। मैं केवल मान सकता हूं कि रास्ते में कुछ खो जाता है।

किसी को भी एक विचार है कि मैं क्या कर रहा हूँ गलत?




बॉक्स से बाहर सीधे एएसपी.नेट 5 और एमवीसी 6 का उपयोग करना मैं यह कर रहा हूं:

JSON:

{
    "Name": "somename",
    "D": {
        "a": "b",
        "b": "c",
        "c": "d"
    }
}

नियंत्रक:

[HttpPost]
public void Post([FromBody]Dictionary<string, object> dictionary)
{
}

यह तब होता है जब यह (नाम और डी की चाबियाँ हैं) के माध्यम से दिखाई देती है:




मुझे यह कस्टम मॉडल बाइंडर के साथ काम करने के लिए मिला, और जिस तरह से डेटा भेजा गया है उसे बदलना; कंटेंटप्रकार का उपयोग करने और कंटेंट टाइप करने के बिना।

जावास्क्रिप्ट:

    $(function() {
        $.ajax({
            url: '/home/a',
            type: 'POST',
            success: function(result) {
                $.ajax({
                    url: '/home/a',
                    data: result,
                    type: 'POST',
                    success: function(result) {

                    }
                });
            }
        });
    });

कस्टम मॉडल बाइंडर:

public class DictionaryModelBinder : IModelBinder
{          
    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        if (bindingContext == null)
            throw new ArgumentNullException("bindingContext");

        string modelName = bindingContext.ModelName;
        IDictionary<string, string> formDictionary = new Dictionary<string, string>();

        Regex dictionaryRegex = new Regex(modelName + @"\[(?<key>.+?)\]", RegexOptions.CultureInvariant);
        foreach (var key in controllerContext.HttpContext.Request.Form.AllKeys.Where(k => k.StartsWith(modelName + "[")))
        {
            Match m = dictionaryRegex.Match(key);
            if (m.Success)
            {
                formDictionary[m.Groups["key"].Value] = controllerContext.HttpContext.Request.Form[key];
            }
        }
        return formDictionary;
    }
}

और Global.asax में मॉडल बाइंडर जोड़कर:

ModelBinders.Binders[typeof(IDictionary<string, string>)] = new DictionaryModelBinder();



बस एक बेहतर deserializer का उपयोग करें यह पहली पंक्ति है जहां मैं स्थिति निर्धारित करता हूं क्योंकि JsonValueProvider अंत में स्ट्रीम छोड़ देता है अधिक एमएस JSON विफल

Request.InputStream.Position = 0;
var reader = new StreamReader(Request.InputStream);

var model = Newtonsoft.Json.JsonConvert.DeserializeObject<CreativeUploadModel>(reader.ReadToEnd());

तो कहीं कि क्रिएटिवअपलोडमॉडल ऑब्जेक्ट ग्राफ में इस तरह एक प्रोप है:

public Dictionary<string, Asset> Assets { get; set; }

जो से (उदाहरण के लिए) deserialized है:

"assets":{"flash":{"type":"flash","value":"http://1234.cloudfront.net/1234.swf","properties":"{\"clickTag\":\"clickTAG\"}"}

Newtonsoft JSON WebAPI के लिए डिफ़ॉल्ट JSON प्रदाता है ... तो यह कहीं भी नहीं जा रहा है




एक स्ट्रिंग के रूप में जटिल वस्तु पोस्ट करें और दूसरे छोर पर deserialize करें। इसके लिए कोई प्रकार की सुरक्षा नहीं है लेकिन इसके लिए यहां स्ट्रिंग कुंजी और स्ट्रिंग सरणी मानों के साथ एक शब्दकोश है।

js:

var data = { 'dictionary': JSON.stringify({'A': ['a', 'b'] }) };

$.ajax({
    url: '/Controller/MyAction',
    data: JSON.stringify(data),
    type: 'POST',
    contentType: 'application/json',
    dataType: 'json'
});

सी # नियंत्रक:

[HttpPost]
public ActionResult MyAction(string dictionary)
{
    var s = new System.Web.Script.Serialization.JavaScriptSerializer();
    Dictionary<string, string[]> d = s.Deserialize<Dictionary<string, string[]>>(dictionary);
    return View();
}