Сохранение данных из MultiSelectList в редактировании и создании представлений - PullRequest
1 голос
/ 01 февраля 2010

У меня есть 3 таблицы: Компании, Субподряды и CompanyToSubcontract

Таблица CompanyToSubcontract является руководством Компании и руководством Субконтракта. У меня есть MultiSelectList в представлениях редактирования и создания субконтракта, где пользователь может выбрать несколько компаний. Наконец-то я заработал, где отображаются правильные компании, выбранные в представлении «Субподряд». У меня нет проблем с сохранением данных.

В представлении создания у субконтракта нет guid до тех пор, пока он не будет записан в базу данных Sql, так как я могу получить guid для сохранения в таблице CompanyToSubcontract?

Кроме того, в режиме редактирования я делаю что-то не так. Это не спасает. Выбор компании. Мне также нужно удалить записи для компаний, которые не выбраны. Каков наилучший способ сделать это?

Я следовал учебному пособию по NerdDinner, чтобы получить основную структуру, и теперь я пытаюсь обновить его, чтобы удовлетворить свои потребности.

Кто-нибудь, кто может указать мне в правильном направлении?

В хранилище субконтрактов:

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 Ответ

1 голос
/ 02 февраля 2010

В выбранной компании foreach петля измените:

cs.subcontract_id = subcontract.subcontract_id;

до:

cs.subcontract = subcontract;

Причина, по которой это работает, подробно объясняется в моем ответе на этот вопрос. Кроме того, LINQ-to-SQL также автоматически управляет назначением первичных ключей и их распространением на внешние ключи. Когда вы вызываете db.SubmitChanges(), он распознает, что если объекту субподряда не присвоен внешний ключ, он обрабатывает его как изменение INSERT. Кроме того, поскольку объект субконтракта связан с объектом CompanyToSubcontract, он знает, как обновить поле внешнего ключа в объекте ассоциации значением первичного ключа, которое он только что назначил объекту Subcontract.

...