我有一个简单的问题。我有一个列表框,我想在我的数据库中保存多个项目,但我不知道如何使用实体框架执行此操作。我尝试使用" for",但它不起作用,因为函数.Count()捕获数据库中的所有行,我只想要用户保存的行。有人可以帮帮我吗? 我必须将一个IDCONCESSSAO保存到许多IDLOCALIDADES。 这是我的代码:
if (ModelState.IsValid)
{
for (int i = 0; i <= db.SINCO_LOCALIDADE_CONCESSAO.ToList().Count(); i++)
{
db.SINCO_LOCALIDADE_CONCESSAO.Add(sinco_localidade_concessao);
db.SaveChanges();
}
return RedirectToAction("Index");
}
答案 0 :(得分:0)
首先,下拉列表和列表框只能返回标量类型(int,string等),或者在列表框中是标量类型列表。通常,选项值将只是用户正在选择的对象的id。您的问题不会给我很多代码,但您需要一个视图模型:
public class FooViewModel
{
// any other properties you need to edit
public List<int> SelectedItemIds { get; set; }
public IEnumerable<SelectListItem> ItemChoices { get; set; }
}
在您的操作中,您需要填充ItemChoices
。我建议在控制器中创建一个私有方法,因为此代码通常在多个操作之间共享:
private void PopulateItemChoices(FooViewModel model)
{
model.ItemChoices = db.Items.Select(m => new SelectListItem
{
Value = m.Id.ToString(),
Text = m.Name
};
}
然后,您只需在创建/编辑操作中返回视图之前调用此方法:
PopulateItemChoices(model);
return View(model);
您的视图将使用此视图模型作为其模型:
@model Namespace.To.FooViewModel
然后你的列表框的代码是:
@Html.ListBoxFor(m => m.SelectedItemIds, Model.ItemChoices)
对于您的帖子操作:
foo.Items = db.Items.Where(m => model.SelectedItemIds.Contains(m.Id));