Salvare i dati da MultiselectList in Modifica e crea visualizzazioni
-
24-09-2019 - |
Domanda
Ho 3 tabelle: aziende, subappalti e societàTosubContract
La tabella aziendaleTosubContract è il GUID dell'azienda e GUID del subappalto. Ho un MultiSelectList sulla modifica del subappalto e creare viste in cui l'utente può selezionare più aziende. Finalmente l'ho fatto funzionare dove visualizza le aziende corrette come selezionate nella vista Modifica del subappalto. Non ho un problema con il salvataggio dei dati.
Nella vista Crea, il subappalto non ha un GUID fino a quando non è scritto nel database SQL, quindi come posso far salvare il GUID nella tabella aziendaletosubContract?
Inoltre, nella vista di modifica, sto facendo qualcosa di sbagliato. Non salva. Le selezioni dell'azienda. Devo anche eliminare i record per le aziende non selezionate. Qual è il modo migliore per farlo?
Ho seguito il tutorial Nerddinner per ottenere la mia struttura di base e ora sto cercando di aggiornare per soddisfare le mie esigenze.
Chiunque possa indicarmi nella giusta direzione?
In subcontractrepository:
public void Save()
{
db.SubmitChanges();
}
In controller:
[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));
}
}
}
Soluzione
Nelle commissioni selezionate foreach
Loop, modifica:
cs.subcontract_id = subcontract.subcontract_id;
a:
cs.subcontract = subcontract;
Il motivo per cui questo funziona è spiegato in dettaglio nella mia risposta a questo domanda. Inoltre, LinQ-a-SQL gestisce anche l'assegnazione delle chiavi primarie e la loro propagazione alle chiavi straniere automaticamente. Quando chiami db.SubmitChanges()
, riconosce che se l'oggetto subappalto non ha una chiave esterna assegnata, la tratta come una modifica di inserimento. Inoltre, poiché l'oggetto subappalto viene associato a un oggetto aziendaleTosubContract, sa di aggiornare il campo chiave estero nell'entità dell'associazione con il valore chiave primario che ha appena assegnato all'entità del subappalto.