2017-02-23 123 views
0

我有一个JavaScript函数,我传递了4个数组,其中每个数组都是 [1,2],只有int值或者[]里面没有值。这些被传递给Url.Action命令。传递int数组到MVC控制器

function Filter(locations, machines, severities, messages) { 
    var url = '@Url.Action("Filter", "ActiveMessages")?' + $.param({ 
     locations: locations, machines: machines, severities: severities, messages: messages }); 
    $.ajax({ 
     url: url, 
     method: 'POST', 
     traditional: true, 
     success: function (data) { } 
    }); 
} 

我试着用$.param()来构建参数。但是这并不能产生我期待的参数,我得到的是这样的:"/ActiveMessages/Filter?locations%5B%5D=1"

我也试着这样做:

decodeURIComponent($.param({ locations: filterlocations, machines: filtermachines, severities: filterseverities, messages: filtermessages })) 

然后我得到的是这样的: "/ActiveMessages/Filter?locations[]=1&locations[]=2"

有没有其他方法可以将这样一个数组解析为一个url?

接收发生在控制器:

public async Task<ActionResult> Filter(int[] locations, int[] machines, int[] severities, int[] messages) 
{ 
    //TODO filter 
} 

调用此方法,但参数为null;

当我开始使用这个工作的单个值,但需要扩展到一个数组。

var url = '@Url.Action("Filter", "ActiveMessages")' + '?locations=' + locations + '&machines=' + machines + '&severities=' + severities + '&messages=' + messages; 
+0

你为什么要通过URL传递它们? –

+0

你会推荐什么其他方式?我认为这将是最简单的方式,因为数据不是私人的 –

+2

我建议将它们传递给AJAX POST,并在数据属性中包含所有数组。像这样的东西http://stackoverflow.com/a/5489534/6157222 –

回答

1
一个职位的行动

最佳实践将是用身体来发送参数后(注paramters的[FromBody]注释):

[HttpPost] 
public async Task<ActionResult> Filter([FromBody] int[] locations, [FromBody] int[] machines, [FromBody] int[] severities, [FromBody] int[] messages) 

的参数需要在被指定Ajax调用的身体:

function Filter(locations, machines, severities, messages) { 
    var url = '@Url.Action("Filter", "ActiveMessages")'; 
    $.ajax({ 
      url: url, 
      method: 'POST', 
      data: JSON.stringify({ locations: locations, machines: machines, severities: severities, messages: messages }), 
      traditional: true, 
      success: function (data) { 
    }}); 
} 
+0

'[FromBody]'在这里是不必要的。该方法只允许POST,所以这个数据当然会来自post主体 –

+0

我已经实现了这个,但我仍然在我的控制器中得到空值 –

+0

我已经构建了如下数据:data:{'locations':locations,'machines ':machines,'severities':严重性,'messages':messages}如 - Ivan Franco所建议的那样。现在我在控制器中获取数据 –

1
var locations = [1,2]; 
var machines = [3,4]; 
var severities = [5,6]; 
var messages = [7,8]; 

$.ajax({ 
    url: @Url.Action("Filter", "ActiveMessages"), 
    method: 'POST', 
    data: { 
      locations: locations, 
      machines: machines, 
      severities: severities, 
      messages: messages 
    }, 
    success: function (data) { 
    } 
}); 

在这种情况下,没有必要字符串化:)

相关问题