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?
-
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 });
}
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.