Estou usando o MVC 3 no meu projeto e estou vendo um comportamento muito estranho.
Estou tentando criar um campo oculto para um valor específico no meu modelo, o problema é que, por algum motivo, o valor definido no campo não corresponde ao valor no modelo.
por exemplo
Eu tenho esse código, apenas como um teste:
<%:Html.Hidden("Step2", Model.Step) %>
<%:Html.HiddenFor(m => m.Step) %>
Eu pensaria que os dois campos ocultos teriam o mesmo valor. O que faço é definir o valor como 1 na primeira vez que exibir a Visualização e, após o envio, aumente o valor do campo Modelo em 1.
Portanto, na primeira vez em que renderizo a página, os dois controles têm o valor 1, mas na segunda vez em que os valores são:
<input id="Step2" name="Step2" type="hidden" value="2" />
<input id="Step" name="Step" type="hidden" value="1" />
Como você pode ver, o primeiro valor está correto, mas o segundo valor parece ser o mesmo da primeira vez que exibi a tela.
o que estou perdendo? Os auxiliares do * For Html estão armazenando em cache os valores de alguma forma? Em caso afirmativo, como posso desativar esse cache?
Obrigado pela ajuda.
Respostas:
Isso é normal e é assim que os auxiliares de HTML funcionam. Eles primeiro usam o valor da solicitação POST e depois o valor no modelo. Isso significa que, mesmo que você modifique o valor do modelo em sua ação do controlador, se houver a mesma variável na solicitação POST, sua modificação será ignorada e o valor POSTed será usado.
Uma solução possível é remover esse valor do estado do modelo na ação do controlador que está tentando modificar o valor:
Outra possibilidade é escrever um auxiliar HTML personalizado que sempre usará o valor do modelo e ignorará os valores POST.
E ainda outra possibilidade:
fonte
Encontrei o mesmo problema ao escrever um Assistente que mostra partes diferentes de um modelo maior a cada etapa.
Os dados e / ou erros do "Passo 1" seriam misturados ao "Passo 2", etc., até que finalmente percebi que o ModelState era o 'culpado'.
Esta foi a minha solução simples:
fonte
ModelState.Clear()
resolvi meu problema com solicitações sequenciais do POST em uma situação semelhante.Este código não irá funcionar
... porque HiddenFor sempre (!) lê ModelState e não o modelo em si. E se não encontrar a tecla "Step", ela produzirá o padrão para o tipo de variável que será 0 neste caso
Aqui está a solução. Eu escrevi para mim mesmo, mas não me importo de compartilhá-lo, porque eu vejo muitas pessoas lutando com esse ajudante malvado do HiddenFor.
Depois, basta usá-lo como de costume dentro da visualização:
Vale mencionar que também trabalha com coleções.
fonte
Estou com muita dificuldade com a mesma situação em que penso, onde uso o mesmo estado de modelo entre as chamadas e quando altero uma propriedade de modelo no back-end. No entanto, não importa para mim, se eu usar textboxfor ou hiddenfor.
Eu apenas ignoro a situação usando scripts de página para armazenar o valor do modelo como uma variável js, porque preciso do campo oculto para esse fim no início.
Não tenho certeza se isso ajuda, mas considere ..
fonte