AJAX& ASP.NET MVC 3:如何将一个字符串参数和一个数组同时传递给Controller

时间:2011-08-26 16:17:10

标签: ajax asp.net-mvc-3 jquery

我有以下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

哪一个搞砸了......

2 个答案:

答案 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,名称必须匹配,以便映射器自动映射它们。