Pergunta

eu tenho um [HttpPost] assinatura do método de ação como esta:

[HttpPost]
public ActionResult Edit(ExistingPostViewModel model)
{
   // Save the edited Post.
}

Agora, no passado (quando eu não usava ViewModels, por exemplo, P&D), tive uma implementação de um Editar método como este:

[HttpPost]
public ActionResult Edit(Post model)
{
    var existingPost = repo.Find(model.Id);
    TryUpdateModel(existingPost);
    repo.Save(existingPost);  
    return RedirectToAction("Success", existingPost.Id);
}

O que funcionou muito bem.

Mas estou confuso sobre como adaptar o que foi dito acima à abordagem ViewModel.

Se eu fizer isso:

TryUpdateModel(existingPost)

Com minha abordagem ViewModel, não acontece muita coisa.Sem erros, mas nada está sendo atualizado porque o MVC não saberá como atualizar um Post a partir de um ExistingPostViewModel (antes era Post -> Post).

Agora estou usando o AutoMapper.Então pensei em mapear do ViewModel para o Post, e salve a postagem.

Mas então estou basicamente substituindo tudo.O que eu não quero fazer e anula o objetivo do ViewModel reduzido.

Alguém pode me des-confundir?

Este parece ser um cenário muito comum e estou totalmente perplexo sobre como as pessoas resolvem isso.Só consigo ver três soluções possíveis:

  1. Não use um ViewModel no HTTP POST.Como eu disse, fiz isso no passado para P&D e funciona, mas agora vejo como minhas Views evoluíram (validação, simplicidade) e não posso comprometer isso apenas por causa deste problema.

  2. Não use TryUpdateModel.Possivelmente, mas então como eu mesclaria as alterações?

  3. Use da esquerda para a direita.Eca.Mas no momento esta parece ser a maneira que estou inclinado.

Alguém, por favor, me dê a solução nº 4!:)

Aliás, estou usando ASP.NET MVC 3, Razor e Entity Framework.

Foi útil?

Solução

Na verdade, encontrei exatamente o mesmo problema em um projeto no qual estou trabalhando.Por mais que eu não fosse fã disso, acabei fazendo a abordagem da esquerda para a direita e mapeando manualmente os dados do meu modelo de visualização de volta para minha entidade.

A única coisa boa sobre essa abordagem é que ela oferece mais controle.Desde que comecei a usar modelos de visão mais compostos, onde você realmente tem campos de mais de uma entidade em seu modelo de visão, começou a fazer mais sentido fazer as coisas dessa maneira.

Também estou usando o AutoMapper, e você está absolutamente certo, fica estranho quando você está tentando fazer uma operação de atualização simples.Gostaria de ter uma solução alternativa superinteligente para você, mas o "jeito antigo" parece fazer o trabalho melhor para o trabalho que venho fazendo.

Outras dicas

Para coisas simples em que você não precisa executar nenhum controle antes de implementar a atualização, o que você está fazendo está certo (db.get () e, em seguida, atualizar).

Quando as coisas ficam complicadas, você precisa carregar a entidade e, em seguida, selecionar e aplicar as alterações do usuário no modelo de visualização, propriedade por propriedade.Nesses casos, você acaba escrevendo métodos de atualização, que obtém os novos dados como entrada e, em seguida, carrega a entidade existente, compara estados e executa as ações necessárias com base nos dados do modelo de visualização.Na verdade, neste caso, provavelmente você não terá um método Update, mas terá comportamentos, como CancelPost, AddComment, EditPost (que também registra o motivo da edição), AddTagsToPost etc.

Não tenho certeza se isso vai ajudar, mas está funcionando para mim.Eu tenho minha tabela de domínio subjacente como um objeto visitante.Meu viewmodel contém o objeto Visitor mais alguns IEnumerables para menus suspensos.

    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Edit(int id)

    {
        Visitor Visitor = new Visitor();
        Visitor = db.Visitors.FirstOrDefault(v => v.VisitorID == id);

        UpdateModel(Visitor, "Visitor");

        db.SaveChanges();
        return RedirectToAction("Index");

    }

O UpdateModel funciona fora do meu viewmodel por causa da string "Visitor" informando quais valores comparar.

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