在编辑和创建视图中保存MultiSelectList中的数据

时间:2010-02-01 17:41:16

标签: c# asp.net-mvc linq-to-sql many-to-many multi-select

我有3张桌子: 公司, 分包合同,和 CompanyToSubcontract

CompanyToSubcontract表是公司的指南和分包合同的指南。我在Subcontract编辑和创建视图上有一个MultiSelectList,用户可以在其中选择多个公司。我终于让它工作,它显示了在Subcontract Edit视图中选择的正确公司。我没有保存数据的问题。

在创建视图中,子合同在写入Sql数据库之前没有guid,那么如何才能将guid保存到CompanyToSubcontract表?

另外,在编辑视图中,我做错了什么。它没有保存。公司的选择。我还需要删除未被选中的公司的记录。这样做的最佳方法是什么?

我按照NerdDinner教程获取我的基本结构,现在我正在尝试更新以满足我的需求。

任何可以指引我朝正确方向前进的人?

在SubcontractRepository中:

public void Save()
    {
        db.SubmitChanges();
    }

在控制器中:

 [AcceptVerbs(HttpVerbs.Post), Authorize]
    public ActionResult Edit(string id, FormCollection formValues)
    {
        // Retrieve existing subcontract
        subcontract subcontract = subcontractRepository.GetSubcontract(id);

        if (subcontract == null)
            return View("NotFound");
        else
        {
            try
            {
                UpdateModel(subcontract);

                IEnumerable<Guid> selectedCompanies = Request.Form["Companies"].Split(new Char[] { ',' }).Select(idStr => new Guid(idStr));

                foreach (var item in selectedCompanies)
                {
                    CompanyToSubcontract cs = new CompanyToSubcontract();
                    cs.subcontract_id = subcontract.subcontract_id;
                    cs.company_id = item;
                    subcontractRepository.Save();
                }


                subcontract.lastupdate_date = DateTime.Now;
                subcontract.lastupdatedby_user = User.Identity.Name;

                //Persist changes back to database
                subcontractRepository.Save();

                //Perform HTTP redirect to details page for the saved subcontract
                return RedirectToAction("Details", new { id = subcontract.subcontract_no });
            }
            catch
            {
                ModelState.AddRuleViolations(subcontract.GetRuleViolations());

                return View(new SubcontractFormViewModel(subcontract));
            }

        }
    }

1 个答案:

答案 0 :(得分:1)

在selectedCompanies foreach循环中,更改:

cs.subcontract_id = subcontract.subcontract_id;

为:

cs.subcontract = subcontract;

我对this问题的回答详细解释了其工作原因。此外,LINQ-to-SQL还管理主键的分配及其自动传播到外键。当您调用db.SubmitChanges()时,它会识别出如果转包对象没有分配外键,则会将其视为INSERT更改。此外,由于转包对象与CompanyToSubcontract对象关联,因此它知道使用刚刚分配给转包实体的主键值更新关联实体中的外键字段。