Melhor maneira de salvar os dados em uma visão fortemente tipado, quando nem todos os campos são carregados
-
18-09-2019 - |
Pergunta
Vamos dizer que eu tenho uma visão de edição que é fortemente tipado para uma tabela chamada "MyData". A exibição tem várias abas, cada uma com vários campos diferentes da tabela. Para o desempenho, os dados só é carregado quando a guia é visto, por isso, se você só editar um campo no separador 1 e enviar o formulário, os dados de guia 2 não será carregado.
O problema que eu estou correndo em é sobre a enviar. Eu estou fazendo a rotina típica de encontrar o registro existente no banco de dados e atualizar os valores passados:
<AcceptVerbs(HttpVerbs.Post)> _
Function Edit(ByVal data As MyData) As ActionResult
Using dc = New MyDataContext
Dim orig = dc.MyDatas.Single(Function(x) x.id = data.id)
orig.name = data.name
orig.desc = data.desc
...
SubmitChanges()
End Using
Return View(orig)
End Function
No entanto, este método não sabe quais guias foram carregados, por isso, se a guia com "desc" sobre ele não é carregado, este método pensa o usuário apagado no campo "desc", e envia NULL no banco de dados.
Como posso construir isso para que apenas campos carregados são enviados para o banco de dados e campos descarregados são ignorados?
Solução
Existe algum motivo você não estiver usando UpdateModel(orig)
?
Se você estava usando obrigatório, em vez de manualmente passando o conteúdo do formulário e atribuir os valores do modelo, isso seria cuidado para você. O comportamento de ligação modelo padrão é ignorar propriedades que tenham valores do formulário não correspondentes.
Você pode querer dar uma olhada este postar , eo artigo ligado lá, para saber mais sobre a ligação modelo.
Outras dicas
Eu recomendaria ter um método de ação separada para cada guia que apenas atualiza os campos nessa guia. A forma em cada guia, então, basta enviar para a ação apropriada.
Talvez um padrão ViewModel pode ajudá-lo aqui, onde você separar seu modelo original, como os pontos de vista guias algo como:
public class Tab1
{
public string pproperty1 { get; set; }
public string pproperty2 { get; set; }
}
public class Tab2
{
public string pproperty3 { get; set; }
public string pproperty4 { get; set; }
}
public class Tab3
{
public string pproperty5 { get; set; }
public string pproperty6 { get; set; }
}
public class ViewModels
{
public Tab1 TAB1 { get; set; }
public Tab2 TAB2 { get; set; }
public Tab3 TAB3 { get; set; }
}
Assim, quando você vincula os valores lançados se a Tab2 == null
então você sabe que este propriedades não foram carregados nem alteradas pelo usuário.
PD:. Desculpe pelo c #, ele foi um tempo vi Eu vb codificado