Когда мой Просмотр отправляет модель обратно в мое действие, как мне сохранить ее обратно в базу данных, откуда она пришла? - PullRequest
0 голосов
/ 09 февраля 2010

Я немного растерялся ...

У меня есть одно действие, которое принимает идентификатор, загружает объект и передает его в представление, которое привязано к модели этого типа объекта.

После редактирования данных в форме, предоставленной представлением, я отправляю обратно к другому действию, которое принимает объект того же точного типа, что и модель.

Однако на данный момент я не могу просто вызвать Repository.Save, я думаю, что у меня теперь совершенно новый объект, больше не связанный с объектом из исходного запроса базы данных, который был отправлен в View.

Так как же я могу обновить ранее запрошенный объект и сохранить изменения в БД вместо того, чтобы вернуть новый объект из представления?

Я даже попытался получить новый экземпляр объекта из БД и присвоить ему возвращенный объект 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 });
}

1 Ответ

0 голосов
/ 09 февраля 2010

Попробуйте использовать метод 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 });
}

HTHS,
Charles

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

...