none
[RESOLVIDO] - Dados somem ao gravar regitro RRS feed

  • Pergunta

  • Olá!

    Em um formulário de edição (Edit.cshtml) tenho o seguinte código:

    @using (Html.BeginForm())
    {
        @Html.AntiForgeryToken()
    
        <div class="form-horizontal">
    
            <hr />
    		
    		<div class="form-group">
    			<label class="col-md-2">@Html.DisplayNameFor(model => model.NumOS)</label>
    			<label class="col-md-2">@Html.DisplayNameFor(model => model.CodCliente)</label>
    			<label class="col-md-8">@Html.DisplayNameFor(model => model.CNPJ)</label>
    			
    			<div class="col-md-2">
    				@Html.DisplayFor(model => model.NumOS)
    			</div>
    
    			<div class="col-md-2">
    				@Html.DisplayFor(model => model.CodCliente)
    			</div>
    			
    			<div class="col-md-8">
    				@Html.EditorFor(model => model.CNPJ, new { htmlAttributes = new { @class = "form-control" } })
    				@Html.ValidationMessageFor(model => model.CNPJ, "", new { @class = "text-danger" })
    			</div>
    		
    		</div>
    	
    	     <div class="form-group">
                <div class="col-md-offset-2 col-md-10">
                    <input type="submit" value="Gravar" class="btn btn-default" />
                </div>
            </div>
        </div>
    }

    Após alterar o CNPJ e clicar em "Gravar", os dados dos campos "NumOS" e "CodCliente" são gravados em branco e o CNPJ é gravado normalmente no banco de dados.
    Como resolver esse problema?

    Obrigado



    • Editado Maurício.Santos quinta-feira, 14 de dezembro de 2017 11:51 Problema solucionado
    quarta-feira, 13 de dezembro de 2017 13:00

Respostas

  • Olá William.

    Desde já agradeço sua ajuda.

    O problema é que necessito dos campos NumOS e CodCliente exibidos na tela, mas o usuário não pode alterá-los e utilizando o HiddenFor esses campos não aparecem.

    Tem alguma outra solução?

    Obrigado.

    Eu nao disse para substituir. Veja o codigo que eu postei. O displayfor continua lá. O que eu sugeri é adicionar campos hidden (adicinar, nao substituir)

    Desta forma voce obtem os valores no post e ainda os exibe.

    Da forma que voce fez é inseguro.. Qualquer um pode (Com as ferramentas de ediçao do browser) modificar o atributo readonly e forçar uma modificaçao de valor. 

    Att


    William John Adam Trindade
    Analyste-programmeur


    Sogi Informatique ltée
    If you found this post helpful, please "Vote as Helpful". If it actually answered your question, remember to "Mark as Answer". Se achou este post útil, por favor clique em "Votar como útil". Se por acaso respondeu sua dúvida, lembre de "Marcar como Resposta".

    • Marcado como Resposta Maurício.Santos quinta-feira, 14 de dezembro de 2017 13:59
    quinta-feira, 14 de dezembro de 2017 13:48
    Moderador
  • [RESOLVI]

    Basta substituir DisplayFor por EditorFor e acrescentar , new { htmlAttributes = new { @class = "form-control", @readonly = "readonly" } } ao final da expressão.

    Abaixo o código que realiza o que necessito:

    @using (Html.BeginForm())
    {
        @Html.AntiForgeryToken()
    
        <div class="form-horizontal">
    
            <hr />
    		
    		<div class="form-group">
    			<label class="col-md-2">@Html.DisplayNameFor(model => model.NumOS)</label>
    			<label class="col-md-2">@Html.DisplayNameFor(model => model.CodCliente)</label>
    			<label class="col-md-8">@Html.DisplayNameFor(model => model.CNPJ)</label>
    			
    			<div class="col-md-2">
    				@Html.EditorFor(model => model.NumOS, new { htmlAttributes = new { @class = "form-control", @readonly = "readonly" } })
    			</div>
    
    			<div class="col-md-2">
    				@Html.EditorFor(model => model.CodCliente, new { htmlAttributes = new { @class = "form-control", @readonly = "readonly" } })
    			</div>
    			
    			<div class="col-md-8">
    				@Html.EditorFor(model => model.CNPJ, new { htmlAttributes = new { @class = "form-control" } })
    				@Html.ValidationMessageFor(model => model.CNPJ, "", new { @class = "text-danger" })
    			</div>
    		
    		</div>
    	
    	     <div class="form-group">
                <div class="col-md-offset-2 col-md-10">
                    <input type="submit" value="Gravar" class="btn btn-default" />
                </div>
            </div>
        </div>
    }

    Obrigado ao William e a todos que tentaram ajudar.


    • Marcado como Resposta Maurício.Santos quinta-feira, 14 de dezembro de 2017 11:51
    • Editado Maurício.Santos quinta-feira, 14 de dezembro de 2017 11:51 Ajuste no código.
    quinta-feira, 14 de dezembro de 2017 11:50

Todas as Respostas

  • O problema é o seguinte: O post só envia para o controller o que é input. Voce tem o Edit somente para o campo CNPJ.

    Os campos "NumOS" e "CodCliente" sao somente DisplayFor (ou seja, nao sao inputs)

    Para que o post funcione, voce tem que adicionar campos Intput Hidden. O razor possui um helper para isso:  https://msdn.microsoft.com/pt-br/library/system.web.mvc.html.inputextensions.hiddenfor%28v=vs.118%29.aspx?f=255&MSPPError=-2147217396

    seu codigo fica assim:

    @using (Html.BeginForm())
    {
        @Html.AntiForgeryToken()
        <!-- campos para o post -->
        @Html.HiddenFor(model  => model.NumOS)
     
        @Html.HiddenFor(model => model.CodCliente)
    
    
    
    
        <div class="form-horizontal">
    
            <hr />
    		
    		<div class="form-group">
    			<label class="col-md-2">@Html.DisplayNameFor(model => model.NumOS)</label>
    			<label class="col-md-2">@Html.DisplayNameFor(model => model.CodCliente)</label>
    			<label class="col-md-8">@Html.DisplayNameFor(model => model.CNPJ)</label>
    			
    			<div class="col-md-2">
    				@Html.DisplayFor(model => model.NumOS)
    			</div>
    
    			<div class="col-md-2">
    				@Html.DisplayFor(model => model.CodCliente)
    			</div>
    			
    			<div class="col-md-8">
    				@Html.EditorFor(model => model.CNPJ, new { htmlAttributes = new { @class = "form-control" } })
    				@Html.ValidationMessageFor(model => model.CNPJ, "", new { @class = "text-danger" })
    			</div>
    		
    		</div>
    	
    	     <div class="form-group">
                <div class="col-md-offset-2 col-md-10">
                    <input type="submit" value="Gravar" class="btn btn-default" />
                </div>
            </div>
        </div>
    }

    att



    William John Adam Trindade
    Analyste-programmeur


    Sogi Informatique ltée
    If you found this post helpful, please "Vote as Helpful". If it actually answered your question, remember to "Mark as Answer". Se achou este post útil, por favor clique em "Votar como útil". Se por acaso respondeu sua dúvida, lembre de "Marcar como Resposta".


    quarta-feira, 13 de dezembro de 2017 16:25
    Moderador
  • Olá William.

    Desde já agradeço sua ajuda.

    O problema é que necessito dos campos NumOS e CodCliente exibidos na tela, mas o usuário não pode alterá-los e utilizando o HiddenFor esses campos não aparecem.

    Tem alguma outra solução?

    Obrigado.

    quarta-feira, 13 de dezembro de 2017 18:10
  • [RESOLVI]

    Basta substituir DisplayFor por EditorFor e acrescentar , new { htmlAttributes = new { @class = "form-control", @readonly = "readonly" } } ao final da expressão.

    Abaixo o código que realiza o que necessito:

    @using (Html.BeginForm())
    {
        @Html.AntiForgeryToken()
    
        <div class="form-horizontal">
    
            <hr />
    		
    		<div class="form-group">
    			<label class="col-md-2">@Html.DisplayNameFor(model => model.NumOS)</label>
    			<label class="col-md-2">@Html.DisplayNameFor(model => model.CodCliente)</label>
    			<label class="col-md-8">@Html.DisplayNameFor(model => model.CNPJ)</label>
    			
    			<div class="col-md-2">
    				@Html.EditorFor(model => model.NumOS, new { htmlAttributes = new { @class = "form-control", @readonly = "readonly" } })
    			</div>
    
    			<div class="col-md-2">
    				@Html.EditorFor(model => model.CodCliente, new { htmlAttributes = new { @class = "form-control", @readonly = "readonly" } })
    			</div>
    			
    			<div class="col-md-8">
    				@Html.EditorFor(model => model.CNPJ, new { htmlAttributes = new { @class = "form-control" } })
    				@Html.ValidationMessageFor(model => model.CNPJ, "", new { @class = "text-danger" })
    			</div>
    		
    		</div>
    	
    	     <div class="form-group">
                <div class="col-md-offset-2 col-md-10">
                    <input type="submit" value="Gravar" class="btn btn-default" />
                </div>
            </div>
        </div>
    }

    Obrigado ao William e a todos que tentaram ajudar.


    • Marcado como Resposta Maurício.Santos quinta-feira, 14 de dezembro de 2017 11:51
    • Editado Maurício.Santos quinta-feira, 14 de dezembro de 2017 11:51 Ajuste no código.
    quinta-feira, 14 de dezembro de 2017 11:50
  • Olá William.

    Desde já agradeço sua ajuda.

    O problema é que necessito dos campos NumOS e CodCliente exibidos na tela, mas o usuário não pode alterá-los e utilizando o HiddenFor esses campos não aparecem.

    Tem alguma outra solução?

    Obrigado.

    Eu nao disse para substituir. Veja o codigo que eu postei. O displayfor continua lá. O que eu sugeri é adicionar campos hidden (adicinar, nao substituir)

    Desta forma voce obtem os valores no post e ainda os exibe.

    Da forma que voce fez é inseguro.. Qualquer um pode (Com as ferramentas de ediçao do browser) modificar o atributo readonly e forçar uma modificaçao de valor. 

    Att


    William John Adam Trindade
    Analyste-programmeur


    Sogi Informatique ltée
    If you found this post helpful, please "Vote as Helpful". If it actually answered your question, remember to "Mark as Answer". Se achou este post útil, por favor clique em "Votar como útil". Se por acaso respondeu sua dúvida, lembre de "Marcar como Resposta".

    • Marcado como Resposta Maurício.Santos quinta-feira, 14 de dezembro de 2017 13:59
    quinta-feira, 14 de dezembro de 2017 13:48
    Moderador
  • Olá William.

    Realmente foi falta de atenção minha.

    Entendi que deveria substituir ao invés de criar os campos como HiddenFor e manter os DisplayFor.

    Vou aplicar a sua sugestão já que ela é mais segura do que a que eu encontrei.

    Mais uma vez obrigado pela ajuda.

    quinta-feira, 14 de dezembro de 2017 13:59