Als meine Einträge auf meine Aktion ein Modell zurück, wie kann ich in der Datenbank speichern es wieder kam es aus?
-
19-09-2019 - |
Frage
Ich bin ein bisschen verwirrt ...
Ich habe eine Aktion, die eine ID, Lasten bis eine Aufgabe übernimmt, und übergibt sie an die Ansicht, die dem Modell dieses Objekttyp gebunden ist.
Nach der Bearbeitung der Daten in der von der Ansicht, ich POST zurück zu einer anderen Aktion gelieferten Form, die ein Objekt des gleichen genauen Typs wie das Modell akzeptiert.
Doch an dieser Stelle kann ich nicht nur Repository.Save nennen, ich glaube, ich habe ein ganz neues Objekt nun nicht mehr im Zusammenhang mit der man aus der ursprünglichen Datenbank-Abfrage, die auf die Ansicht gesendet wurde.
Wie kann ich das vorher abgefragten Objekt aktualisieren und speichern Sie die Änderungen an die DB statt ein neues Objekt wieder aus dem Blick zu bekommen?
Ich habe sogar versucht, eine neue Instanz des Objekts von der DB erhalten und die Zuordnung der View-Objekt, um es zurück, und dann Repo.Save (), noch kein Glück.
Was mache ich hier falsch?
Controller-Code:
[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 });
}
Lösung
Versuchen Sie, die TryUpdateModel
Methode. Auf diese Weise können die Unternehmen aus dem Repository erhalten, bevor Sie es Databind.
[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. im Allgemeinen ist es eine schlechte Idee, databind auf Ihre Domain-Modelle ... Verwendung Präsentationsmodelle statt, und dann können Sie dieses ganze Thema umgehen.