9

我有以下问题:

在按钮单击上,我将一些数据发布到服务器。我的控制器动作如下所示:

public ActionResult Accept(List<MyViewModel> entries)
{
    //here entries HAS 2 MyViewModel-Instances in it.
    //The entries are not null, but the values of the instances are!
    //entries[0].ParamA is null
}

MyViewModel 如下所示:

public class MyViewModel
{
    public string ParamA { get; set; }
    public string ParamB { get; set; }
}

AJAX-Call 如下:

var myEntries = { entries: [{ ParamA: "A", ParamB: "B" }, { ParamA: "C", ParamB: "D" }] };

$.ajax({
    type: 'POST',
    url: url,
    cache: false,
    data: myEntries,
    dataType: 'text' });

我已经尝试做的事情:

  • 将数据类型更改为“json”
  • 使用:传统:真
  • 试过 var myEntries = JSON.stringify(...);
  • 试过 var myEntries = { entries : [JSON.stringify({ ... }), JSON.stringify({ ... })] };
  • 与上面相同,但使用 jQuery.param(..., true);
  • 使用 IEnumerable 或 MyViewModel[] 而不是列表。
  • 以上任意组合

我在这里做错了什么?

非常非常感谢您提前帮助我!

编辑

我的 (Razor)View 目前并不有趣,因为它与任何事情都无关。我没有使用任何 HTML.TextBoxFor(或类似)方法来填充 myEntries-Variable。它实际上是动态填充的(因为有很多很多条件)。为了这个问题(以及我自己的测试),我对变量进行了硬编码。:)

4

3 回答 3

13

有了你的回答和使用的JSON.stringify方法,它对我有用

var myEntries = { entries: [{ ParamA: "A", ParamB: "B" }, 
                            { ParamA: "C", ParamB: "D" }] };

$.ajax({
        type: 'POST',
        url: '/{controller}/{action}',
        cache: false,
        data: JSON.stringify(myEntries),
        dataType: 'json', 
        contentType: 'application/json; charset=utf-8'
    });
于 2012-04-12T07:35:09.140 回答
5

我得到了答案!

jQuery 有时会让人感到困惑。

dataType 是指定要从服务器返回什么的参数。contentType 是指定您发送到服务器的内容的参数。

因此,从上面的示例中,如果您添加:

内容类型:'应用程序/json;字符集=utf-8',

在 AJAX 调用中。

于 2012-04-12T06:55:03.153 回答
1

只是为了补充有关如何创建将回发到控制器的列表的答案。那是因为您不需要用列表的名称包装数组。它看起来很难看,并且使用内置函数无法管理。这个例子是为了展示如何回发 MVC 可以理解并解释为 List 的 JSON。(但即使 Array 被包装了它仍然可以工作,但这是静态内容并且难以管理)

这个例子使用了 jQuery 的 sortable 插件。我想用新的排序索引将整个列表模型发回以保存在数据库中。

update: function (event, ui) {

 img = { key: 0, order: 0, url: '' }; //Single image model on server
 imgs = new Array(); //An array to hold the image models.

 //Iterate through all the List Items and build my model based on the data.
 $('#UploaderThumbnails li').each(function (e) {
      img.key = $(this).data('key');  //Primary Key
      img.order = $(this).index();  //Order index
      imgs.push(img); //put into "list" array
 });

 //And what is in the answer - this works really great
 $.ajax({
     url: '/Image/UpdateOrder',
     data: JSON.stringify(imgs),
     type: 'POST',
     contentType: 'application/json; charset=utf-8'
  });

}

我的 MVC 控制器就像...

  [HttpPost]
  public ActionResult UpdateOrder(List<Models.Image> images)
  {
     //Images at this point is a proper C# List of Images! :) Easy!

      return Content("");
  }
于 2013-06-24T12:34:12.203 回答