Lorsque mon avis POSTs un modèle de nouveau à mon action, comment puis-je enregistrer revenir à la base de données, il est venu?

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

  •  19-09-2019
  •  | 
  •  

Question

Je suis un peu confus ...

J'ai une action qui prend un ID, charge un objet, et passe à la vue qui est lié au modèle de type de cet objet.

Après avoir modifié les données sous la forme fournie par la vue, je republier à une autre action qui accepte un objet du même type exactement comme le modèle.

Cependant, à ce stade, je ne peux pas simplement appeler Repository.Save, je pense avoir une marque nouvel objet maintenant, non plus associé à celui de la requête de base de données d'origine qui a été envoyée à la vue.

Alors, comment puis-je mettre à jour l'objet interrogé précédemment et enregistrer les modifications apportées à la base de données au lieu d'obtenir un nouvel objet de retour de la vue?

J'ai même essayé d'obtenir une nouvelle instance de l'objet de la DB et attribuer la vue est retourné objet, puis Repo.Save (), toujours pas de chance.

Qu'est-ce que je fais mal ici?

CODE DE COMMANDE:

[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 });
}
Était-ce utile?

La solution

Essayez d'utiliser la méthode de TryUpdateModel. De cette façon, vous pouvez obtenir la compagnie du dépôt avant Databind à elle.

[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. En général, il est une mauvaise idée de DataBind à vos modèles de domaine ... utiliser des modèles de présentation à la place et vous pouvez contourner ce problème entier.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top