Cuando mis usuarios ver los post de un modelo nuevo a mi acción, ¿cómo puedo volver a guardarlo en la base de datos vino?

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

  •  19-09-2019
  •  | 
  •  

Pregunta

Estoy un poco confundido ...

Tengo una acción que toma un ID, cargas de hasta un objeto y lo pasa a la vista, que se une al modelo de tipo de ese objeto.

Después de editar los datos en el formulario suministrado por la vista, después de vuelta a otra acción que acepta un objeto del mismo tipo exacto como el modelo.

Sin embargo en este momento no puedo simplemente llamar Repository.Save, creo que tengo un nuevo objeto marca ahora, ya no asociado con el de la consulta de base de datos original que fue enviado a la vista.

Entonces, ¿cómo puedo actualizar el objeto previamente consultada y guardar los cambios en la base de datos en vez de conseguir un nuevo objeto de vuelta de la vista?

incluso intenté conseguir una nueva instancia del objeto de la base de datos y asignar el objeto Ver volvió a él, y luego Repo.Save (), todavía no hubo suerte.

¿Qué estoy haciendo mal aquí?

controlador de código:

[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 });
}
¿Fue útil?

Solución

Trate de usar el método TryUpdateModel. De esta manera se puede lograr que la empresa desde el repositorio antes de databind a él.

[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, España Charles

Sal. en general, que es una mala idea para DataBind a sus modelos de dominio ... utilizar modelos de presentación en su lugar y luego se puede conseguir alrededor de todo este asunto.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top