Pergunta

Estou trabalhando em um aplicativo ASP.NET MVC2. Eu percebi uma coisa muito surpreendente, mas incrível que o MVC faz nos bastidores, relacionado ao ModelState e à ligação do modelo. Eu tenho um viewmodel que tem um monte de dados - alguns campos fazendo parte de um formulário, enquanto outros fazem parte da interface do usuário. No HTTPPOST, meu método de ação usa o DefaultModelBinder, que tenta vincular todo o modelo, mas apenas os campos que faziam parte do formulário são desserializados com sucesso - todos os outros permanecem nulos. Isso é bom e compreensível. Se o ModelState for inválido, eu preciso Atualizar o modelo do banco de dados e ligar Esses campos de forma específicos antes de retornar à mesma exibição de edição para exibir os erros de validação do ModelState associados.

Aqui é onde chega minha surpresa e curiosidade. Foi minha suposição de que, para que eu ligar Os campos de formulário com o modelo atualizado, eu precisava fazer uma chamada para UpdateModel() ou TryUpdateModel<>(), passando no modelo recém -renovado. Por exemplo:

[HttpPost]
public ActionResult EditDetail(EditDetailItemModel model)
{
    if (model.IsValid)
    {
        // Save the results to the db

        return RedirectToAction(...)
    }

    // Can't simply "return View(model)". Not all fields in EditDetailItemModel
    // were part of the form - thus they returned null. Have to refresh
    // model from the db.

    var refreshedModel = RefreshModelFromDB();

    // Is this line necessary?????
    TryUpdateModel<EditDetailItemModel>(refreshedModel);

    return View(refreshedModel);
}

Mas, o que eu descobri foi que, se eu simplesmente voltasse refreshedModel para a vista sem fazer uma chamada para TryUpdateModel<>(), O modelo atualizado foi automaticamente vinculado aos valores do campo de formulário publicados!! Portanto, o TryUpdateModel<>() não é necessário aqui!

A única maneira de entender isso é que, como o ModelState está em um estado inválido, uma vez que devolvi a vista com o modelo atualizado, o "mecanismo de renderização do MVC" emitiu os erros do Modelstate e vinculou esses valores de propriedade com meu refrescado modelo. Isso é simplesmente incrível! Mas quero provas sobre essa suposição. Não consigo encontrar documentação sobre isso em qualquer lugar da web. Alguém pode confirmar minha hipótese de por que/como esse incrível comportamento de ligação automática está ocorrendo e/ou me educar sobre o porquê/como isso está acontecendo, esperançosamente apoiado com alguns links de documentação on -line, para que eu entendi mais completamente o que está acontecendo sob os cobertos?

Foi útil?

Solução

public ActionResult EditDetail(EditDetailItemModel model)

Essa linha executará a ligação do modelo. Pense nos parâmetros de ação de ação como sempre sendo preenchido por uma chamada para updatemodel.

Você não está vendo os valores da AgeredModel na visualização, está vendo as entradas e valores do ModelState do EditDetailItemModel.

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