2015-03-02 42 views
0

我有文件,在我的jQuery下面的代码后的Json解释到控制器

var bases = {}; 
for (var j = 0; j < selectedVariants.length; j++) { 
    bases[selectedVariants[j].BId] = selectedVariants[j].CId; 
} 

和我得到在基地的一些数据字典现在

,在这里我的问题是我怎么通过这个基地通过ajax调用字典到控制器。

我想以后的事,但基地控制器算来了零

$.ajax({ 
    url: $.url('~/TUP/Tflow'), 
    type: 'POST', 
    data: { baseDetails: JSON.stringify(bases)}, 
    async: true, 
    cache: false, 
}); 

这里的时候,我在我的控制器看到...基地计数是未来零

请帮我这

控制器:

[HttpPost] 
public JsonResult Tflow(JsonFileContentInputs basedetails) 
{ 
    //some code 
} 

和我的模型:

[ModelBinder(typeof(JsonModelBinder))] 
[DataContract] 
public class JsonFileContentInputs 
{ 
    [JsonProperty(PropertyName = "basedetails")] 
    [DataMember] 
    public Dictionary<string, string> basedetails { get; set; }    
} 
+2

你能发布你的控制器代码吗? – rmorrin 2015-03-02 09:38:49

+1

你不需要对它进行字符串化,该函数应该注意把它转换成JSON。这更依赖于你的控制器的配置。你使用哪种服务器端技术? – 2015-03-02 09:40:14

+0

或者[fiddle](http://jsfiddle.net)? – JNF 2015-03-02 09:41:11

回答

1

而不是接收类对象,你应该接收它作为字符串,然后序列化到像下面的对象。

public JsonResult Tflow(string basedetails) 
{ 
    //some code 
    var model = new JavascriptSerializer().Deserialize<JsonFileContentInputs>(basedetails); 
    // Your code 
} 
2

请尝试以下方法。作为@EhsanSajjad提到的,你将需要调用JSON.stringify对您的所有数据,而不仅仅是bases对象:

$.ajax({ 
    url: '/TUP/Tflow', 
    type: 'POST', 
    data: "json=" + JSON.stringify({baseDetails: bases}), // stringify everything, 
    dataType: 'text', 
    async: true, 
    cache: false 
}); 

然后在你的控制器,而不是试图使用模型绑定,我们就可以反序列化数据本身使用Json.NET。

控制器:

[HttpPost] 
public ActionResult Tflow(string json) 
{ 
    // deserialize 
    var data = JsonConvert.DeserializeObject<JsonFileContentInputs>(json); 

    // more code 
} 

型号:

// You can drop these two as we aren't using the modelbinding 
// [ModelBinder(typeof(JsonModelBinder))] 
// [DataContract] 
public class JsonFileContentInputs 
{ 
    [JsonProperty(PropertyName = "baseDetails")] 
    public Dictionary<string, string> BaseDetails { get; set; } 
} 

不幸的是,读控制器的请求的原始流似乎MVC控制器不会玩生JSON好的是必要的默认。 More info here.

编辑:它看起来像你可以将原始JSON传递给MVC控制器,你只需要指定ajax dataType为text并确保参数名称匹配。我相应地更新了我的答案。