Melhor maneira de salvar os dados em uma visão fortemente tipado, quando nem todos os campos são carregados

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

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?

Foi útil?

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

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