none
Criar e editar uma entidade na mesma view RRS feed

  • Pergunta

  • Uma coisa que me desanima no MVC é a idéia que os caras passaram em todos os post de blog que eu ja vi até hoje é TER que criar uma view para se criar uma entidade, outra para editar, outra para vizualizar. Entendo que há ocasiões que isso pode ser útil, mas NÃO É O MEU CASO! Por exigência não posso listar os produtos em outra tela e depois clicar para ir para outra e editar...

    Já faz um tempo que estou tentando resolver isso e nunca consigo totalmente, então resolvi pedir ajuda...

    Inicialmente eu estava usando uma Action "Salvar" que se parecia com isso:

    [AcessoRestrito(VerificarParaOTipo = typeof(Produto), Nivel = NiveisPermissao.Salvar/*Eu sei que é nojento mas eu faço outro if igualzinho o de baixo para saber qual a permissao a verificar =S*/ )]
    public ViewResult Salvar(int? id, [Bind(Exclude="Id")]Produto entidadeASalvar)
    if(id.HasValue)
    {
         //oba! estou editando!
    }
    else
    {
         //só inserções aqui ;]
    }


    Por alguns motivos óbvios não estou mais disposto a fazer assim... além do que não posso usar o bind separadamente pra cada caso...

    Até pensei em criar duas views, cada uma com sua action e para não ter que fazer todos os campos novamente( o principal motivo por eu não querer fazer views separadas ), fazer uma outra partial contendo apenas os campos em comum(todos). Mas não resolveria também pois "Produto/Editar/2" não é a única maneira de se editar algo... estou usando um grid que tem um botão que após clicado, preênche os campos do formulário com uma função javascript genérica que recebe um json e envia para os campos. Está funcionando lindamente, eu tenho algo como viewForm.JsonFor(p => p.Descricao) que a partir disso gero meu json, já habilitando ou desabilitando os campos editáveis e meu repositório olha um atributo "NaoAtualizavelAttribute" para ver se pode dar um "SetModified" na entidade.

    E tem outro fator client que muda esse "Modo editando", é um botão limpar que chama um script e começa um novo cadastro.

    Pensei também em fazer esses scripts mudarem a action do form e no "Produto/Editar/2" ja mandar a action de editar ou o "Index" mandar a de criar. Gostei desse modo, mas gostaria de algumas dicas sobre a melhor maneira para fazer assim ou alguma outra sugestão.

    +.+
    segunda-feira, 7 de dezembro de 2009 15:08

Respostas

  • Uma coisa que me desanima no MVC é a idéia que os caras passaram em todos os post de blog que eu ja vi até hoje é TER que criar uma view para se criar uma entidade, outra para editar, outra para vizualizar. Entendo que há ocasiões que isso pode ser útil, mas NÃO É O MEU CASO! Por exigência não posso listar os produtos em outra tela e depois clicar para ir para outra e editar...

    Já faz um tempo que estou tentando resolver isso e nunca consigo totalmente, então resolvi pedir ajuda...

    Inicialmente eu estava usando uma Action "Salvar" que se parecia com isso:

    [AcessoRestrito(VerificarParaOTipo = typeof(Produto), Nivel = NiveisPermissao.Salvar/*Eu sei que é nojento mas eu faço outro if igualzinho o de baixo para saber qual a permissao a verificar =S*/ )]
    public ViewResult Salvar(int? id, [Bind(Exclude="Id")]Produto entidadeASalvar)
    if(id.HasValue)
    {
         //oba! estou editando!
    }
    else
    {
         //só inserções aqui ;]
    }


    Por alguns motivos óbvios não estou mais disposto a fazer assim... além do que não posso usar o bind separadamente pra cada caso...

    Até pensei em criar duas views, cada uma com sua action e para não ter que fazer todos os campos novamente( o principal motivo por eu não querer fazer views separadas ), fazer uma outra partial contendo apenas os campos em comum(todos). Mas não resolveria também pois "Produto/Editar/2" não é a única maneira de se editar algo... estou usando um grid que tem um botão que após clicado, preênche os campos do formulário com uma função javascript genérica que recebe um json e envia para os campos. Está funcionando lindamente, eu tenho algo como viewForm.JsonFor(p => p.Descricao) que a partir disso gero meu json, já habilitando ou desabilitando os campos editáveis e meu repositório olha um atributo "NaoAtualizavelAttribute" para ver se pode dar um "SetModified" na entidade.

    E tem outro fator client que muda esse "Modo editando", é um botão limpar que chama um script e começa um novo cadastro.

    Pensei também em fazer esses scripts mudarem a action do form e no "Produto/Editar/2" ja mandar a action de editar ou o "Index" mandar a de criar. Gostei desse modo, mas gostaria de algumas dicas sobre a melhor maneira para fazer assim ou alguma outra sugestão.

    +.+

    cara....

    Olha eu faria assim....

    Primeiramente, Criaria apenas 2 action (get, post) da view. Não sei se vc utiliza JavaScript mas eu utilizaria jQuery, creio que no seu grid existem no minimo 3 botões: Adicionar, Editar e Excluir certo ?

    Para cada clique no botão desejado, realizaria pelo jQuery a validação desejada e passaria para a action os parâmetros precisos e mais um chamado "acao" (neste parametro acao eu passaria "editar", "excluir" ou "adicionar"), ai na sua action vc faz um Request e verifica o tipo da acao. 

    Dessa forma vc consegue saber o que fazer e te mtodos os parametros desejados....

    Não sei se é bem isso a sua dúvida, mas qualquer coisa posta aew ...

    Abs,

    -----------------------------------------------------------------------------------------------------------------------------------------------------------------
    Se ajudou marque como útil
    sexta-feira, 5 de fevereiro de 2010 23:53

Todas as Respostas

  • Uma coisa que me desanima no MVC é a idéia que os caras passaram em todos os post de blog que eu ja vi até hoje é TER que criar uma view para se criar uma entidade, outra para editar, outra para vizualizar. Entendo que há ocasiões que isso pode ser útil, mas NÃO É O MEU CASO! Por exigência não posso listar os produtos em outra tela e depois clicar para ir para outra e editar...

    Já faz um tempo que estou tentando resolver isso e nunca consigo totalmente, então resolvi pedir ajuda...

    Inicialmente eu estava usando uma Action "Salvar" que se parecia com isso:

    [AcessoRestrito(VerificarParaOTipo = typeof(Produto), Nivel = NiveisPermissao.Salvar/*Eu sei que é nojento mas eu faço outro if igualzinho o de baixo para saber qual a permissao a verificar =S*/ )]
    public ViewResult Salvar(int? id, [Bind(Exclude="Id")]Produto entidadeASalvar)
    if(id.HasValue)
    {
         //oba! estou editando!
    }
    else
    {
         //só inserções aqui ;]
    }


    Por alguns motivos óbvios não estou mais disposto a fazer assim... além do que não posso usar o bind separadamente pra cada caso...

    Até pensei em criar duas views, cada uma com sua action e para não ter que fazer todos os campos novamente( o principal motivo por eu não querer fazer views separadas ), fazer uma outra partial contendo apenas os campos em comum(todos). Mas não resolveria também pois "Produto/Editar/2" não é a única maneira de se editar algo... estou usando um grid que tem um botão que após clicado, preênche os campos do formulário com uma função javascript genérica que recebe um json e envia para os campos. Está funcionando lindamente, eu tenho algo como viewForm.JsonFor(p => p.Descricao) que a partir disso gero meu json, já habilitando ou desabilitando os campos editáveis e meu repositório olha um atributo "NaoAtualizavelAttribute" para ver se pode dar um "SetModified" na entidade.

    E tem outro fator client que muda esse "Modo editando", é um botão limpar que chama um script e começa um novo cadastro.

    Pensei também em fazer esses scripts mudarem a action do form e no "Produto/Editar/2" ja mandar a action de editar ou o "Index" mandar a de criar. Gostei desse modo, mas gostaria de algumas dicas sobre a melhor maneira para fazer assim ou alguma outra sugestão.

    +.+

    cara....

    Olha eu faria assim....

    Primeiramente, Criaria apenas 2 action (get, post) da view. Não sei se vc utiliza JavaScript mas eu utilizaria jQuery, creio que no seu grid existem no minimo 3 botões: Adicionar, Editar e Excluir certo ?

    Para cada clique no botão desejado, realizaria pelo jQuery a validação desejada e passaria para a action os parâmetros precisos e mais um chamado "acao" (neste parametro acao eu passaria "editar", "excluir" ou "adicionar"), ai na sua action vc faz um Request e verifica o tipo da acao. 

    Dessa forma vc consegue saber o que fazer e te mtodos os parametros desejados....

    Não sei se é bem isso a sua dúvida, mas qualquer coisa posta aew ...

    Abs,

    -----------------------------------------------------------------------------------------------------------------------------------------------------------------
    Se ajudou marque como útil
    sexta-feira, 5 de fevereiro de 2010 23:53
  • Davi, acho que é importante entender que a criação de uma View para operação do CRUD é apenas uma sugestão.

    Felizmente o framework do MVC é bastante flexível para que você possa criar soluções da sua própria maneira, como no exemplo que nosso colega deu usando jQuery. O lado bom do MVC é a possibilidade de controlar exatamente o que sera gerado no código HTML, por isso você pode gerar até um modelo totalmente dinâmico com AJAX.

    Entendo que a maioria dos exemplos se baseia nesse modelo que você falou, mas o importante é você buscar explorar o framework para ver as possibilidades que você tem de criar as coisas, esse é o ponto forte de um framework!

    Espero que ajude!
    Obrigado.


    Rafael Veronezi
    Database Administrator | BI Analyst
    Twitter: http://twitter.com/ravero
    Blog: http://raver0.wordpress.com
    segunda-feira, 8 de fevereiro de 2010 23:48