Quando i miei Vedi tutti i messaggi di un modello di nuovo alla mia azione, come faccio a salvare di nuovo al database proviene?
-
19-09-2019 - |
Domanda
Sono un po 'confuso ...
Ho un'azione che richiede un ID, carichi di un oggetto, e lo passa alla vista che è legato al modello di tipo di quella oggetto.
Dopo aver modificato i dati nel modulo fornito dalla vista, ho posto a un altro azione che accetta un oggetto dello stesso tipo come il modello.
Tuttavia, a questo punto non posso chiamare Repository.Save, penso di avere un nuovo oggetto ora, non è più associato a quello della query di database originale che è stata inviata alla vista.
Così come posso aggiornare l'oggetto in precedenza interrogato e salvare le modifiche al DB invece di ottenere un nuovo oggetto di ritorno dal View?
Ho provato anche ottenere una nuova istanza dell'oggetto dal DB e assegnando la vista tornò oggetto ad esso, e quindi Repo.Save (), ancora senza fortuna del genere.
Che cosa sto facendo male qui?
CODICE CONTROLLER:
[Authorize]
public ActionResult EditCompany(int id)
{
//If user is not in Sys Admins table, don't let them proceed
if (!userRepository.IsUserSystemAdmin(user.UserID))
{
return View("NotAuthorized");
}
Company editThisCompany = companyRepository.getCompanyByID(id);
if (editThisCompany == null)
{
RedirectToAction("Companies", new { id = 1 });
}
if (TempData["Notify"] != null)
{
ViewData["Notify"] = TempData["Notify"];
}
return View(editThisCompany);
}
//
// POST: /System/EditCompany
[Authorize]
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult EditCompany(Company company)
{
string errorResponse = "";
if (!isCompanyValid(company, ref errorResponse))
{
TempData["Notify"] = errorResponse;
return RedirectToAction("EditCompany", new { id = company.CompanyID });
}
else
{
Company updateCompany = companyRepository.getCompanyByID(company.CompanyID);
updateCompany = company;
companyRepository.Save();
return RedirectToAction("EditCompany", new { id = company.CompanyID });
}
return RedirectToAction("Companies", new { id = 1 });
}
Soluzione
Provare a utilizzare il metodo TryUpdateModel
. In questo modo è possibile ottenere l'azienda dal repository prima di DataBind ad esso.
[Authorize]
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult EditCompany(int id, FormCollection form)
{
//Default to a new company
var company = new Company();
//If we have an id, we must be editing a company so get it from the repo
if (id > 0)
company = companyRepository.getCompanyByID(id);
//Update the company with the values from post
if (TryUpdateModel(company, form.ToValueProvider()))
{
string errorResponse = "";
if (!isCompanyValid(company, ref errorResponse))
{
TempData["Notify"] = errorResponse;
return RedirectToAction("EditCompany", new { id = company.CompanyID });
}
else
{
companyRepository.Save();
return RedirectToAction("EditCompany", new { id = company.CompanyID });
}
}
return RedirectToAction("Companies", new { id = 1 });
}
HTHS,
Charles
Ps. in genere si tratta di una cattiva idea di DataBind ai vostri modelli di dominio ... utilizzare modelli di presentazione, invece e poi si può andare in giro l'intera questione.