【发布时间】:2013-10-10 14:46:11
【问题描述】:
我的 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 的内容,IList<T> 作为 JavaScript 数组,其中数组的每个元素都是一个关联列表,其属性类似于服务器端 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 对象和正确的属性名称(Name 和Id)但是每个@987654335 的两个属性的值@对象为null或0,即即使有客户端发送的值也不初始化。
请帮忙。
【问题讨论】:
标签: jquery asp.net-mvc model-binding