2012-04-04 135 views
16

我一直在努力寻找解决此问题的方法。将数组作为JSON传递给MVC控制器

在我的代码中,我构建了一个对象的数组;

var $marks = []; 

var mark = function (x, y, counter){ 
    this.x = x; 
    this.y = y; 
    this.counter = counter; 
} 

$marks.push(new mark(1, 2, 0)); 
$marks.push(new mark(1, 2, 1)); 
$marks.push(new mark(1, 2, 2)); 

现在我想这个数据发布到一个MVC控制器,所以我认为,在控制器中的数据类型将是一个List<Mark> Marks或标记的数组。

要发布数据,我试过了;

var json = JSON.stringify($marks); 
$.post('url', json).done(function(data){ /* handle */ }); 

OR

var json = { Marks: $marks }; 
$.post('url', json).done(function(data){ /* handle */ }); 

第二种方式,望着发布数据时,看起来像这样

Marks[0][x]: 1 
Marks[0][y]: 2 
Marks[0][counter]: 0 
Marks[0][x]: 1 
Marks[0][y]: 2 
Marks[0][counter]: 1 
Marks[0][x]: 1 
Marks[0][y]: 2 
Marks[0][counter]: 2 

但我不知道如何翻译成一个强类型对象本在控制器中?

我的控制器看起来像这样;

[HttpPost] 
public ActionResult JsonSaveMarks(List<Mark> Marks){ 
    // handle here 
} 

我的马克班看起来像这样;

public class Mark{ 
    public string x { get; set; } 
    public string y { get; set; } 
    public string counter { get; set; } 
} 

我已经通过有关创建自定义JsonFilterAttribute,或使用System.Web.Script.Serialization.JavaScriptSerializer类其他类似问题阅读,但我不能得到任何工作

有什么明显的,我在这里失踪?我有控制器中的DataType完全错误吗?如何将这些数据转换为强类型对象?

非常感谢

+0

你在MVC中的Mark-class是什么样的? – Pbirkoff 2012-04-04 08:52:45

+0

@Pbirkoff我已更新与类 – 2012-04-04 08:55:13

+1

检查此问题,尤其是第一个答案的问题:http://stackoverflow.com/questions/4789481/post-an-array-of-objects-via-json-to-asp -net-mvc3 – Pbirkoff 2012-04-04 09:03:47

回答

14

$.post()不允许你设置你的AJAX调用的内容类型 - 你可能会发现(如果你使用Fiddler),您的JSON字符串被与内容型“应用发送/ x-www-form-urlencoded“(默认设置),然后导致Asp.Net MVC错误地解释你的数据包。

您可以尝试使用$.ajax()代替,并将内容类型设置为“application/json”?

http://api.jquery.com/jQuery.ajax/

+0

啊,你打我吧,有同样的想法 – Pbirkoff 2012-04-04 09:05:23

+1

谢谢!在我头痛之后,我知道这会很简单!更改我的代码使用'$ .ajax()'也传递数据通过'JSON.stringify($马克)' – 2012-04-04 09:20:13

+0

非常感谢。这是我的情况下的内容类型。 – Jelling 2013-03-22 22:10:48

13

@SteveHobbs这里有正确的答案。另一方面,你应该像JavaScript一样负责JavaScript的有效载荷。如果以相反的方式执行此操作,则会在反序列化进入的数据时收到异常,例如“无效的JSON基元”

下面是完整的解决方案,您的样本:

$.ajax({ 

    url: '/home/index', 
    type: 'POST', 
    data: JSON.stringify($marks), 
    dataType: 'json', 
    contentType: 'application/json', 
    success: function (data, textStatus, jqXHR) { 
     console.log(data); 
    } 
}); 
1

此代码固定我的问题:

C#类:

public class MediaAccountContent 
{ 
    public Guid IdMedia { get; set; } 
    public string Value { get; set; } 

} 

public class User 
{ 
    public string Firstname { get; set; } 
    public string Lastname { get; set; } 
    public List<MediaAccountContent> MediaAccountContents { get; set; } 
} 

MVC行动:

public ActionResult SavePlace(User user) 
{ 

    return Content("OK"); 
} 

Javascript:

var mediaAccountsJson = []; 

    for (var i = 0; i < 10; i++) 
    { 
     mediaAccountsJson.push({ 
      IdMedia: i, 
      Value: "AAA" + i 
     }); 

    } 

    var datatItem = 
    { 
     Firstname: "Test Firstname", 
     Lastname: "Test Lastname", 
     MediaAccountContents: mediaAccountsJson 
    }; 

    $.ajax({ 
     type: "POST", 
     contentType: 'application/json; charset=utf-8', 
     data: JSON.stringify(datatItem), 
     url: urlAction, 
     success: function (status) { 



     } 
    }); 

根据您的场景进行所需的更改并享受! :)

+0

这段代码只发布json对象而不是对象数组 – mzonerz 2016-11-02 10:35:47

相关问题