我如何从js向服务器发送对象数组?

时间:2011-06-22 15:50:39

标签: jquery .net asp.net-mvc json

我的班级

[Serializable]
    public class VSpecialQualifiers
    {
        public VCD LivingStatus { get; set; }
        public VCD Relationship { get; set; }
        public string OnSetAge { get; set; }
    }

我的js功能

 $.ajax({
                url: url,
                type: 'POST',
                datatype: 'json',
                data: {
                   'arr' : self.specialQualifiers
                }
          });

我的serverMethod

[HttpPost]
        public JSONResult SaveProblem(object[] arr)
        {
          //i cant't cast to target type
        }

如何将js中的对象数组传递给服务器?

2 个答案:

答案 0 :(得分:2)

这不重要,但看起来你在这里使用jQuery,你应该提到。现代浏览器有一个JSON.stringify可以将JavaScript数组转换为可以传递给服务器的JSON字符串。较旧的浏览器没有这个,所以你需要包含一个像这样的JSON库:

http://www.json.org/js.html

然后相同的功能将适用于所有浏览器。

一旦包含,您传递数据的地方传递:

data: JSON.stringify(self.specialQualifiers);

请注意,我不知道self.specialQualifiers是什么,但它应该解析为数组。您应该在Firefox的Firebug或Chrome / Safari的Web检查器中执行console.log,以确保这实际上是一个真正的变量。

在你的.net端,你需要一个字符串,然后hava .net库将该字符串转换为一个数组。您不能通过HTTP传递本机对象,只能传递字符串。

答案 1 :(得分:2)

这对我有用(对后端的C#MVC)。

...在js:

var viewModel = new Object();
viewModel.Items = items; // items is a js array of objects
$.ajax({
    data: JSON.stringify(viewModel),
    type: "POST",
    contentType: 'application/json; charset=utf-8',
    cache: false,
    url: 'CONTROLLERNAME/ACTIONNAME', // replace as necessary here
    success: function (data) {
       // handle the return value, if any, here
    }
});

...在控制器中,这里的签名非常重要:

[HttpPost]
public ActionResult ACTIONNAME(WorksheetVM inputModel) {

...这是一个关联的ViewModel定义,它适用于WorksheetItemVM是viewmodel DTO,其中包含要传递的每个Js对象的字段列表:

public class WorksheetVM {
    public WorksheetItemVM[] Items { get; set; }
}