使用$.post将对象集合传递给MVC控制器

7
我们正在尝试使用json和jQuery的.post函数将对象集合从我们的页面发送到我们的控制器(MVC 3)。以下是我们的js代码以及控制器和对象定义。
问题在于,虽然对象被适当地发送到我们的控制器,但它的成员变量没有被填充。"Coords"列表具有适当数量的"Coord"对象,但每个Coord对象的成员变量被填充为零(而不是null),而不是我们传递的值。请参见截图:
对于我们的实现有什么问题吗?
提前感谢!
Coord1 = { "X": 100, "Y": 200 };
Coord2 = { "X": 300, "Y": 400 };

zoneData = { "Color": "#D8F834", "Name": "new zone", "Coords": [Coord1, Coord2] }

$.post("/Demo/SaveZone", zoneData, function (resp) {
     alert(resp);
}, "json");





[HttpPost]
public ActionResult SaveZone(ZoneViewModel zvm)
{
     Zone z;

     z = AutoMapper.Mapper.Map<ZoneViewModel, Zone>(zvm);

     _db.Zone.Attach(z);
     _db.SaveChanges();

     return View();
}


public class ZoneViewModel
{

    public int Id { get; set; }
    public string Name { get; set; }
    public string Color { get; set; }

    public CoordViewModel[] Coords { get; set; }

}


public class CoordViewModel
{
    public int Id { get; set; }
    public int X { get; set; }
    public int Y { get; set; }

}

你是否已经下载了MVC源代码,将项目引用添加到其中,并逐步执行默认的模型绑定代码? - redsquare
你能在 Firebug/Fiddler 中展示 httppost 请求体吗? - redsquare
2个回答

13

可能最简单的方式是使用JSON请求:

var coord1 = { X: 100, Y: 200 };
var coord2 = { X: 300, Y: 400 };
var zoneData = { 
    Color: '#D8F834', 
    Name: 'new zone', 
    Coords: [ coord1, coord2 ] 
};

$.ajax({
    url: '/Demo/SaveZone',
    type: 'POST',
    contentType: 'application/json; charset=utf-8',
    data: JSON.stringify(zoneData),
    success: function(resp) {
        alert(resp);
    }
});
JSON.stringify方法将JavaScript对象序列化为JSON字符串,是现代浏览器内置的原生方法。如果要支持没有此方法的旧版浏览器,您需要包含json2.js脚本,该脚本检查浏览器是否原生支持它,如果不支持,则提供实现。
现在一切都应该正常绑定:

enter image description here

这是一个成功请求的示例:

enter image description here


我们尝试了这个和其他各种不同的调整,但仍然没有运气。那些 .X 和 .Y 值仍然作为零发布。 - Ben Finkel
1
@Ben Finkel,你使用了和我回答中完全相同的代码吗?因为我刚在我的计算机上测试了一下,它运行得很好。所以当你说它不起作用时,你让我非常惊讶。 - Darin Dimitrov
是的,我看到你的屏幕截图了,但我感到困惑。我尝试复制并粘贴你的代码,但没有成功。问题依旧存在。 - Ben Finkel
@Ben Finkel,你在FireBug中看到了什么?AJAX请求发送了什么到服务器?我已经上传了一个成功请求的截图。你的CoordViewModel 的X和Y属性是否真的像你在问题中展示的那样有公共的getters和setters吗? - Darin Dimitrov
在另一台电脑上,我们已经让它工作了,所以这一定是我的配置问题。谢谢Darin! - Ben Finkel
@Ben Finkel,您使用哪个浏览器进行测试? - Darin Dimitrov

0

我的猜测:

public List<CoordViewModel> Coords { get; set; }

我承认这是一次碰运气的尝试。


好的想法,但没有运气。谢谢! - Ben Finkel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接