我有一个控制器方法,看起来像这个
public ActionResult SpecialOrderSummary(int? id)
{
if (id == null)
{
return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
}
JobOrder jobOrder = db.JobOrders.Find(id);
if (jobOrder == null)
{
return HttpNotFound();
}
ViewBag.JobOrderID = jobOrder.ID;
ItemInstance ii = db.ItemInstances.Where(x => x.serialNumber == jobOrder.serialNumber).FirstOrDefault();
Item item = db.Items.Find(ii.ItemID);
var vm = new ItemViewModel
{
ItemId = item.ItemID,
ItemName = item.Name,
Parts = new List<ItemPartViewModel>
{
foreach (ItemHasParts ihp in item.IHP)
{
Part part = db.Parts.Find(ihp.PartID);
new ItemPartViewModel
{
PartId = part.ID,
PartName = part.Name
};
}
} //this is closing method
}; // this is closing controller
return View(vm);
}
但是Parts列表的最后一个}
和vm并没有关闭右括号。相反,Parts}
正在关闭该方法,而vm}
正在关闭控制器。
为什么会发生这种情况?我的语法有问题吗?
是的,在Parts
列表初始化中不能有foreach
循环。
你必须做:
var vm = new ItemViewModel
{
ItemId = item.ItemID,
ItemName = item.Name,
Parts = new List<ItemPartViewModel>()
};
foreach (ItemHasParts ihp in item.IHP)
{
Part part = db.Parts.Find(ihp.PartID);
vm.Parts.Add(new ItemPartViewModel
{
PartId = part.ID,
PartName = part.Name
};
}
我很惊讶编译器居然让你编译?
不确定您在这里的目标是什么:
Parts = new List<ItemPartViewModel>
{
foreach
如果这是初始化Parts变量,它不能包含foreach循环
集合初始值设定项需要包含固定数量的元素。您可以使用变量和表达式,但必须有一定数量的变量和表达式:
var stringList = new List<string>() { "a", "b", "c", "d"+"e", person.Name };
编译器将把它变成一堆对Add((的调用
如果你有一些可变数量的项目,你可以添加、添加范围或进行LINQ查询来形成你的列表:
foreach(var person in myPeople)
stringList.Add(person.Name);
//or
stringList.AddRange(myStringArray);
//or
stringList = people.Select(x => x.Name).ToList();
最后一个并没有添加到现有列表中;它正在用另一份清单全面取代这份清单。如果你想添加到现有的,你可以:
stringList.AddRange(people.Select(x => x.Name));
LINQ查询的结果是字符串的可枚举列表