有没有办法传递这个JavaScript对象
Object { 35=true,179=true,181=true}
进入控制器动作
Dictionary<int,bool>
我检查了以下方法:
var remoteUrl = "@Url.Action("UpdateProjectStructureSelection")" + "?tlpId=@Model.TopLevelProjectId"; $.post(remoteUrl,mapSiteSelectionChoices,function(callbackResult) { alert(callbackResult); });
和
var remoteUrl = "@Url.Action("UpdateProjectStructureSelection")" + "?tlpId=@Model.TopLevelProjectId"; $.post(remoteUrl,{ values : mapSiteSelectionChoices },function(callbackResult) { alert(callbackResult); });
但是在这两种情况下
public ActionResult UpdateProjectStructureSelection(int tlpId,Dictionary<int,bool> values)
被称为,但价值观是空的.
因为我已经将更复杂的类型转换为控制器动作而没有编写自定义模型绑定器,所以我一直在想我是否只是在这里做错了.
自定义模型绑定器是将它作为字典的唯一方法吗? (除了在客户端使用JsonConvert stringify之外)
加法(这有效,但我喜欢避免额外的代码):
public ActionResult UpdateProjectStructureSelection(int tlpId,string values) { var dict = JsonConvert.DeserializeObject<Dictionary<int,bool>>(values); }
解决方法
不是该格式的对象.它需要采用以下格式才能由DefaultModelBinder使用
var data = { 'dict[0].key': '35','dict[0].value': 'True','dict[1].key': '179','values[1].value': 'True',dict[0].key': '8','dict[0].value': 'True' }; $.post(remoteUrl,data,function(callbackResult) {
和控制器
public ActionResult UpdateProjectStructureSelection(Dictionary<int,bool> dict)
如您所述,另一种选择是使用自定义ModelBinder,例如this answer