Когда мое представление отправляет модель обратно в мое действие, как мне сохранить ее обратно в базу данных, из которой она была получена?
-
19-09-2019 - |
Вопрос
Я как-то в замешательстве...
У меня есть одно действие, которое принимает идентификатор, загружает объект и передает его представлению, которое привязано к модели типа этого объекта.
После редактирования данных в форме, предоставленной представлением, я возвращаюсь к другому действию, которое принимает объект того же типа, что и модель.
Однако на данный момент я не могу просто вызвать Repository.Save, я думаю, что теперь у меня есть совершенно новый объект, больше не связанный с объектом из исходного запроса к базе данных, который был отправлен в представление.
Итак, как я могу обновить ранее запрошенный объект и сохранить изменения в БД вместо того, чтобы получать новый объект обратно из представления?
Я даже пытался получить новый экземпляр объекта из БД и присвоить ему возвращаемый объект View, а затем Repo.Save(), но все равно безуспешно.
Что я здесь делаю не так?
КОД КОНТРОЛЛЕРА:
[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 });
}
Решение
Попробуйте использовать TryUpdateModel
метод.Таким образом, вы можете получить компанию из репозитория до привязки к ней данных.
[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 });
}
ХТХ,
Чарльз
Пс.как правило, привязка данных к моделям вашего домена — плохая идея...вместо этого используйте модели представления, и тогда вы сможете обойти всю эту проблему.