Als meine Einträge auf meine Aktion ein Modell zurück, wie kann ich in der Datenbank speichern es wieder kam es aus?

StackOverflow https://stackoverflow.com/questions/2231892

  •  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 });
}
War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top