Quando meus Ver as mensagens a volta Modelo para a minha ação, como faço para salvá-lo de volta para o banco de dados ele veio?

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

  •  19-09-2019
  •  | 
  •  

Pergunta

Eu sou o tipo de confuso ...

Eu tenho uma ação que leva um ID, cargas de até um objeto, e passa para o modo de exibição que está ligado ao modelo do tipo desse objeto.

Depois de editar os dados na forma fornecida pela View, volta eu POST para outra ação que aceita um objeto do mesmo tipo exato como o modelo.

No entanto, neste momento eu não posso simplesmente chamar Repository.Save, eu acho que tenho um novo objeto de marca agora, não está mais associado com o um a partir da consulta de banco de dados original que foi enviado para a View.

Então, como posso atualizar o objeto previamente consultado e salvar as alterações para o DB em vez de começar um novo objeto de volta da View?

Eu até tentei obter uma nova instância do objeto do DB e atribuindo o Ver voltou objeto para ele, e depois Repo.Save (), ainda não tive essa sorte.

O que estou fazendo de errado aqui?

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 });
}
Foi útil?

Solução

Tente usar o método TryUpdateModel. Desta forma, você pode obter da empresa a partir do repositório antes de vincular a ele.

[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. geralmente é uma má idéia de vincular a seus modelos de domínio ... modelos de uso de apresentação em vez e, em seguida, você pode obter em torno de toda esta questão.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top