AJAX和ASP.NET MVC 3:如何同时传递字符串参数和数组到控制器

4
我有以下的控制器签名:
public void DoSomething(string dialerJob, MyViewModel[] agentStates)

视图模型表示表单字段的数组(HTML表格中选择的项目)。我通过Robert Koritnik的.toDictionary() jQuery插件(http://erraticdev.blogspot.com/2010/12/sending-complex-json-objects-to-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[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][value]=999 & agentStates[2][name]=[0].stateId & agentStates[2][value]=1 & agentStates[3][name]=[0].subStateId & agentStates[3][value]=1 & agentStates[4][name]=[1].agentId & agentStates[4][value]=15884 & agentStates[5][name]=[1].projectId & agentStates[5][value]=999 & agentStates[6][name]=[1].stateId & agentStates[6][value]=1 & agentStates[7][name]=[1].subStateId & agentStates[7][value]=1
这段文本看起来有些混乱。
2个回答

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脚本。


3
达林,这似乎发送了正确的JSON字符串(我在Fiddler中查看它,看起来是正确的),但显然MVC3出了问题,因为两个参数在到达控制器时都为空。我猜测默认的模型绑定器不知道如何处理它。我不知道。 - Chris Holmes
2
不确定您所说的 MVC3 出了什么问题。我使用它时非常顺利。 - palm snow

0
将js job变量更改为dialerJob,名称必须匹配以便于映射器自动映射它们。

原来这并不重要。数据1数组发生了某些问题,导致它变得混乱不堪。 - Chris Holmes
数组到底发生了什么?您是否尝试创建一个反映数据类型的模型对象?即为数组和字符串命名适当的属性? - kmcc049

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