0

我正在用 [int,bool] 填充数组:

$.each(ownedChecked, function (key, val) {
    /*code to set id as int and paintedTrue as bool*/
    ownedIDs.push([id,paintedTrue]);
});

我创建了一个将被字符串化的 var:

var saveData = { OwnedListEntryIDs:ownedIDs };

//send data
$.ajax({
    url: '/ListEntry/OwnedModels',
    type: 'POST',
    contentType: 'application/json; charset=utf-8',
    data: JSON.stringify(saveData),
    success: function (data) { alert('Update success: ' + data); },
    failure: function (data) { alert('Update failed: ' + data); }
});

这是视图模型:

public class OwnedPaintedSave
{
    //collection contains a ListEntryID and a bool indicating whether it is painted or not
    public Dictionary<int,bool> OwnedListEntryIDs { get; set; }
}

进入控制器方法后,ModelState.Isvalid 传递,代码进入 foreach 循环,但模型始终为 NULL:

[HttpPost]
public JsonResult OwnedModels(OwnedPaintedSave models)
{
    if (ModelState.IsValid)
    {
        foreach (var id in models.OwnedListEntryIDs)
        { }
    }
}

我尝试在 $.ajax 方法中设置传统:true,但同样的问题。我猜 ViewModel 中的 Dictionary 不是我需要绑定的,但我不确定它应该是什么。谢谢你的帮助。

4

2 回答 2

1

我为 OwnedPaintedSave 对象提供了两个 int[] 属性,一个用于 OwnedIDs,一个用于 PaintedIDs。

于 2012-05-28T19:53:28.823 回答
0

我认为问题出在您的控制器上。您正在传递var saveData = { OwnedListEntryIDs:ownedIDs };(本质上是Dictionary<int, bool>- 是吗?)作为您的数据,但操作结果中的参数是类型OwnedPaintedSave

我认为,如果您将控制器参数更改为Dictionary<int, bool> ownedListEntryIDs并且不对 javascript 对象进行字符串化,则该框架足够聪明,可以序列化和反序列化您的对象。所以你会有这个...

var saveData = { OwnedListEntryIDs:ownedIDs };

//send data
$.ajax({
    url: '/ListEntry/OwnedModels',
    type: 'POST',
    contentType: 'application/json; charset=utf-8',
    data: saveData,
    success: function (data) { alert('Update success: ' + data); },
    failure: function (data) { alert('Update failed: ' + data); }
});

然后在你的控制器中......

[HttpPost]
public JsonResult OwnedModels(Dictionary<int, bool> ownedListEntryIDs)
{
    if (ModelState.IsValid)
    {
        foreach (var id in ownedListEntryIDs)
        { }
    }
}
于 2012-05-28T07:09:21.313 回答