我有以下Controller签名:
public void DoSomething(string dialerJob, MyViewModel[] agentStates)
viewModels表示数组中的表单字段(HTML表中的选定项)。我想出了如何将表单元素int作为数组参数传递给控制器,这要感谢Robert Koritnik的.toDictionary()jQuery插件(http://erraticdev.blogspot.com/2010/12/sending-complex-json-对象到aspnet.html)。
但是,现在我需要将一个额外的字符串参数(从下拉列表)传递给控制器,我无法弄清楚如何使其工作。我尝试过各种组合,比如:
var job = $('#DialerJobs').attr('value');
var data1 = $.toDictionary(data, "agentStates");
$.ajax({
url: "/Blending/ChangeOutboundJob",
type: "POST",
dataType: "application/JSON",
data: {job, data1}
});
我也尝试了以下内容:
var job = $('#DialerJobs').attr('value');
var data1 = $.toDictionary(data, "agentStates");
$.ajax({
url: "/Blending/ChangeOutboundJob",
type: "POST",
dataType: "application/JSON",
data: {dialerJob: job, agentStates: data1}
});
但是都不行。
如果从要发送的数据中删除dialerJob参数,则agentStates会正确填充控制器。发送的内容如下:
agentStates[0].agentId=7654&agentStates[0].projectId=999&agentStates[0].stateId=1&agentStates
[0] .subStateId = 1&安培; agentStates [1] .agentId = 9876&安培; agentStates [1] .projectId = 999&安培; agentStates
[1] .stateId = 1&安培; agentStates [1] .subStateId = 1
但如果我加入dialerJob,那么发送的是:
dialerJob=SomeJob&agentStates[0][name]=[0].agentId&agentStates[0][value]=84&agentStates[1][name]=
[0] .projectId&安培; agentStates [1] [值] = 999&安培; agentStates [2] [姓名] = [0] .stateId&安培; agentStates [2] [值]
= 1&安培; agentStates [3] [名称] = [0] .subStateId&安培; agentStates [3] [值] = 1&安培; agentStates [4] [名称] = [1] .agentId&安培; agentStates
[4] [值] = 15884&安培; agentStates [5] [名称] = [1] .projectId&安培; agentStates [5] [值] = 999&安培; agentStates [6] [名称] = [1] .stateId&安培; agentStates [6] [值] = 1&安培; agentStates [7] [名称] = [1] .subStateId&安培; agentStates [7] [值] = 1
哪一个搞砸了......
答案 0 :(得分:8)
您可以使用JSON请求:
$.ajax({
url: '@Url.Action("ChangeOutboundJob", "Blending")',
type: 'POST',
contentType: 'application/json; charset=utf-8',
data: JSON.stringify({
dialerJob: 'job',
agentStates: [
{ property1: 'value 1', property2: 'value 2' },
{ property1: 'value 3', property2: 'value 4' }
]
}),
success: function (result) {
// TODO: process the results
}
});
这将成功映射到以下控制器操作:
public void DoSomething(string dialerJob, MyViewModel[] agentStates)
其中MyViewModel
的定义如下:
public class MyViewModel
{
public string Property1 { get; set; }
public string Property2 { get; set; }
}
备注:JSON.stringify
方法本身内置于所有现代浏览器中。如果您需要支持旧版浏览器,则需要在页面中加入json2.js脚本。
答案 1 :(得分:0)
将js job var更改为dialerJob,名称必须匹配,以便映射器自动映射它们。