Quando i miei Vedi tutti i messaggi di un modello di nuovo alla mia azione, come faccio a salvare di nuovo al database proviene?

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

  •  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 });
}
È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top