Когда мое представление отправляет модель обратно в мое действие, как мне сохранить ее обратно в базу данных, из которой она была получена?

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

  •  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 });
}

ХТХ,
Чарльз

Пс.как правило, привязка данных к моделям вашего домена — плохая идея...вместо этого используйте модели представления, и тогда вы сможете обойти всю эту проблему.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top