使用实体框架保存列表框中的项目

时间:2014-12-12 17:27:27

标签: c# entity-framework asp.net-mvc-4 listbox

我有一个简单的问题。我有一个列表框,我想在我的数据库中保存多个项目,但我不知道如何使用实体框架执行此操作。我尝试使用" 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");
        }

1 个答案:

答案 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));