MVC 3 AJAX Post,列表填充了对象,但对象属性为空

时间:2012-04-11 07:47:53

标签: ajax asp.net-mvc-3 jquery model-binding

我有以下问题:

在按钮上单击我将一些数据发送到服务器。 我的控制器Action看起来像这样:

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' });

我已经尝试过做的事情:

  • 将dataType更改为“json”
  • used:traditional:true
  • 尝试了var myEntries = JSON.stringify(...);
  • 尝试了var myEntries = {entries:[JSON.stringify({...}),JSON.stringify({...})]};
  • 与上面相同,但是使用jQuery.param(...,true);
  • 使用IEnumerable或MyViewModel []代替list。
  • 上述
  • 的任何组合

我在这里做错了什么?

非常感谢您提前帮助我!

修改

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

3 个答案:

答案 0 :(得分:12)

通过您的回答和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'
    });

答案 1 :(得分:5)

我得到了答案!

jQuery有时会让人感到困惑。

dataType是指定要从服务器获取BACK的内容的参数。 contentType是指示您发送给服务器的内容的参数。

所以从上面的例子中可以看出,如果你添加:

contentType:'application / json;字符集= UTF-8' ,

在AJAX调用中

答案 2 :(得分:1)

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

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

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("");
  }