【问题标题】:Saving data from MultiSelectList in Edit and Create Views在编辑和创建视图中保存来自 MultiSelectList 的数据
【发布时间】:2010-02-01 17:41:15
【问题描述】:

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

CompanyToSubcontract 表是 Company 的 guid 和 Subcontract 的 guid。我在 Subcontract Edit 和 Create 视图上有一个 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));
            }

        }
    }

【问题讨论】:

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


    【解决方案1】:

    在 selectedCompanies foreach 循环中,更改:

    cs.subcontract_id = subcontract.subcontract_id;
    

    到:

    cs.subcontract = subcontract;
    

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

    【讨论】:

    • 当我将它从 subcontract_id 更改为 subcontract 时,它告诉我 Models.CompantyToSubcontract 不包含 subcontract 的定义。
    • 刚刚意识到我还需要删除未选中公司的记录。这样做的最佳方法是什么?
    • CompanyToSubcontract 和数据库中的 Subcontract 表之间有外键关系吗?
    • 我假设您要删除的公司没有 CompanyToSubcontract 记录。话虽如此,首先使用 DeleteOnSubmit() 删除公司实体,然后调用 SubmitChanges()。
    • 您可能需要单独收集已存在的项目。有了这个,你所要做的就是: if (originalCollection.Contains(companyToCheck)) DeleteOnSubmit(companyToCheck);否则 InsertOnSubmit(companyToCheck);.在没有看到你所拥有的东西的情况下,很难真正引导你找到解决方案。希望我不会完全让你感到困惑。我去过你所在的地方,你在那里并不好玩,但一旦你到达另一边,真的很好。
    猜你喜欢
    • 2015-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-27
    • 2017-11-14
    • 2020-10-29
    • 2012-01-21
    相关资源
    最近更新 更多