3

我的 MVC 代码中有一个服务器端对象,如下所示:

class Person
{
  public long Id { get; set; }

  public string Name { get; set; }

  public IList<Friend> Friends { get; set; } 
}

class Friend
{
  public long Id { get; set; }

  public string Name { get; set; }
}

从 jQuery 客户端,我发出一个 ajax 请求并发送以下数据(为了便于阅读而引入了换行符):

var personId = $(...
var personName = $(...

var friends = []; // array of associative arrays

for (var i = 0; i < _friends.length; i++) // _friends is is a global array object and is different from friends below
{
  var friendId = $(...
  var friendName = $(...)

  friends[i] = { 'Id' : friendId, 'Name' : friendName };
}

...等等以将值放入变量中

请注意,我正在发送应该进入Person.Friends的内容,作为 JavaScript 数组,其中数组的每个元素都是一个关联列表,具有与服务器端类IList<T>一样的属性。Friend

这是我的ajax请求:

$.ajax('/Strings/JsonCreateNew', 
  { 
    cache: false, async: false, type: 'POST', 
    data: { 
        'Id' : personId, 
        'Name' : personName, 
        'Friends' : friends}, 
    dataType: 'json', 
    error: SaveNewFriendClientSideHandler.OnError, 
    success: SaveNewFriendClientSideHandler.OnSuccess 
  });

在我的控制器中,只要我有一个FormCollection接收数据,我就会得到我的所有数据,但我想绑定到强类型的 Person 对象,所以如果我改变我的控制器定义:

[HttpPost]
public ActionResult JsonCreateNew(FromCollection person)
{
  // I get all the data in the person.AllKeys property
  return new EmptyResult();
}

至:

[HttpPost]
public ActionResult JsonCreateNew(Person person)
{
  // the default ASP.NET MVC model binder isn't able to bind to this
  // in fact, the routing module does not even route the request to this
  // action, so this action never gets fired.
  return new EmptyResult();
}

我仍然可以获得我所有的数据,但我仍然很担心IList<Friend>.

它在Person对象中作为一个数组接收,该数组具有正确数量的Friends具有正确属性名称(NameId)的对象,但每个Friend对象的两个属性的值都是null或 0,即即使有值被发送,也不会被初始化客户。

请帮忙。

4

3 回答 3

9

MVC 中有一个错误,他们拒绝修复如果集合属性名称以它不绑定的类型名称开头。改变

    public IList<Friend> Friends { get; set; } 

至:

    public IList<Friend> Biscuits { get; set; } 

只是暂时的。它会起作用的。

于 2013-10-22T15:07:56.100 回答
0

我认为它会起作用:

var p = { 'Id' : personId, 'Name' : personName, 'Friends' : friends };
$.ajax('/Strings/JsonCreateNew', 
  { 
    type: 'POST', 
    data: JSON.Stringify({ person : p }), 
    contentType : "application/json",
    dataType: 'json', 
    error: SaveNewFriendClientSideHandler.OnError, 
    success: SaveNewFriendClientSideHandler.OnSuccess 
  });

如果您只想遍历它们,我也更喜欢 IEnumerable<> 而不是 IList<>

编辑 测试用例:

var friends = new Array();
friends.push({ Id: "1", Name: "A" });
friends.push({ Id: "2", Name: "B" });
var p = { 'Id': 5, 'Name': "Mohammad", 'Friends': friends };

$(document).ready(function () {

  $.ajax('/Home/JsonCreateNew',
  {
      type: 'POST',
      data: JSON.stringify({ person: p }),
      contentType: "application/json",
      dataType: 'json',
      error: function () { alert("f"); },
      success: function () { alert("s"); }
  });

});
于 2013-10-10T15:14:41.570 回答
0

您必须指定内容类型:contentType: "application/json". @MohammadRB 解决方案包含它,但即使您不对帖子数据进行字符串化,它也应该可以工作。

于 2014-02-25T16:52:29.723 回答