我有一个表"recipientMap"。这个表是这样的:
| MapID | IPgroupID | PCgroupID | AlertID
|:------|----------:|:---------:|:------:
| 1 | 1 | 1 | 15
| 2 | 3 | null | 15
| 3 | 3 | null | 16
这个表帮助我知道谁可以访问消息。
这个选择是在用户从Mvc应用程序中编写警报时完成的,每个警报都有一个复选框列表。因此,我为已检查的IP组id和已检查的PC组id构建了一个数组,并将两者推入一个新的多维数组。我把这个数组发送给控制器。下一步是对其进行迭代,并基于RecipientMap模型构建一个列表。
问题是当列表中的一个或多或少有选中的id时。例如,如果我在多维数组中有这样一个结果:
list[0][0]=1
list[0][1]=3
list[1][0]=1
我得到一个错误,因为没有list[1][1]
。我的列表必须有相同的长度…这是不好的,我知道这是因为我的迭代方法不正确,我需要一些建议来纠正它。
List[0][x]
表示IP, List[1][x]
表示PC。我的数组可以有一个或两个列表。
$('#bttn').click(function () {
var brutelistip = null;
brutelistip = [];
var brutelistpc = null;
brutelistpc = [];
$('#AlertCreationTabs #AlertCreationTabs-1 input:checkbox:checked').each(function () {
brutelistip.push($(this).attr('value'));
});
$('#AlertCreationTabs #AlertCreationTabs-2 input:checkbox:checked').each(function () {
brutelistpc.push($(this).attr('value'));
});
var recipientlist = new Array();
recipientlist[0] = brutelistip;
recipientlist[1] = brutelistpc;
$.ajax({
url: '/Panels/CreateNewAlert',
dataType: 'json',
type: 'post',
contentType: 'application/json; charset=utf-8',
data: JSON.stringify({
...
list: recipientlist,
}),
async: false,
processData: true,
success: function (data) {
alert(data);
},
error: function (xhr) {
alert('error');
}
});
});
和控制器:
public JsonResult CreateNewAlert(AlertMap alertMap, AlertLog alertLog, RecipientMap recipientMap, int[][] list)
{
if (ModelState.IsValid)
{
...
var RM = new RecipientMap();
List<RecipientMap>reciplist = new List<RecipientMap>();
for (int i = 0; i < list.Length; i++)
{
reciplist.Add(new RecipientMap
{
IPgroupID = list[0][i],
PCgroupID = list[1][i]
});
}
AL.RecipientMap.AddRange(reciplist);
AL.AlertMap.Add(AM);
db.AlertLog.Add(AL);
db.SaveChanges();
}
...
}
谢谢,我找到解决方案了!首先,我希望保留[0]的ip列表和[1]的pc列表。因此,我添加了一个if语句,如果没有选中项,则push 0。
if ($('#AlertCreationTabs #AlertCreationTabs-1 input:checkbox:checked').length > 0)
{
$('#AlertCreationTabs #AlertCreationTabs-1 input:checkbox:checked').each(function () {
brutelistip.push($(this).attr('value'));
});
} else {
brutelistip.push(0);
}
if ($('#AlertCreationTabs #AlertCreationTabs-2 input:checkbox:checked').length > 0)
{
$('#AlertCreationTabs #AlertCreationTabs-2 input:checkbox:checked').each(function () {
brutelistpc.push($(this).attr('value'));
});
} else {
brutelistpc.push(0);
}
然后在控制器
中if (list[0][0]!=0)
{
for (int i = 0; i < list[0].Length; i++)
{
reciplist.Add(new RecipientMap
{
IPgroupID = list[0][i],
});
}
}
if (list[1][0]!=0)
{
for (int j = 0; j < list[1].Length; j++)
{
reciplist.Add(new RecipientMap
{
PCgroupID = list[1][j],
});
}
}
我知道重复代码不是一个很好的做法,但是…这就够了。
假设list[0]
和list[1]
的长度相同,那么将list.Length
替换为list[0].Length
可能是明智的:
for (int i = 0; i < list[0].Length; i++)
{
reciplist.Add(new RecipientMap
{
IPgroupID = list[0][i],
PCgroupID = list[1][i]
});
}
如果它们的长度不相同,则在访问其中一个之前必须进行条件检查。这两种解决方案都有点繁琐,但它们都适用于不同的情况。
如果一个存在而另一个不存在,您可以将null
插入到RecipientMap
属性中以创建List<RecipientMap>
元素。或者你根本不能创造它。这完全取决于你的实现。